gpt4 book ai didi

c++ - 从 C++ 中的函数返回用户定义对象列表时出错

转载 作者:行者123 更新时间:2023-11-28 02:44:13 25 4
gpt4 key购买 nike

背景

我写了一个类Str模仿字符串操作,用于教学目的。类(class)Str本质上是一个字符数组。

我创建了一个函数 makeList收到 Str对象,创建 Str 的列表使用 push_back 的对象并返回列表。

我正在使用 allocators , 但我已经加强了内存管理,只为创建的角色分配足够的内存。

问题

  • 编译、链接和运行时没有错误。

  • MakeList内查看列表对象内容正常使用 cout << ret.back() .

  • 问题是当在 main 中查看时,列表中的对象有垃圾输入覆盖前 ~10 个字符 body 。

  • 我还验证了 Str我创建的正在通过默认析构函数销毁。

我已经包含了最少量的代码来重现该问题。

非类代码:

list<Str> makeList(const Str s)
{
list<Str> ret;
ret.push_back(s);
cout << ret.back() << endl;

return ret;
}

int main() {

Str greeting = "Hello world";
list<Str> result;
result = makeList(greeting);
result.pop_front();
cout << "The result is " << result.front() << endl;

return 0;
}

类(class)代码:

class Str {
friend std::istream& operator>>(istream&, Str&);
public:
typedef char* iterator;
typedef const char* const_iterator;
typedef size_t size_type;
typedef char value_type;

Str() { create(); } // default constructor

Str(const_iterator cp, const_iterator cp2) {
create(cp, cp2);
}
Str(const_iterator cp) {
create(cp, cp + strlen(cp));
}
~Str() {uncreate(); }

char& operator[](size_type i) { return data[i]; }
const char& operator[](size_type i) const { return data[i]; }

Str& operator=(const Str& s) {
uncreate();
create(s.begin(), s.end());
};

Str substr(size_type i, size_type d) const {
const_iterator cStart, cTerm;
cStart = this->begin() + i;
cTerm = this->begin() + i + d;
Str sub(cStart, cTerm);
cout << "Pointer diff = " << sub.limit - sub.data << endl;
return sub;
}

size_type size() const { return avail - data; }

iterator begin() { return data; }
const_iterator begin() const { return data; }

iterator end() { return avail; }
const_iterator end() const { return avail; }


private:
iterator data;
iterator avail;
iterator limit;

allocator<char> alloc;

void create();
void create(const_iterator, const_iterator);

void uncreate();

};

void Str::create()
{
data = avail = limit = 0;
}

void Str::create(const_iterator i, const_iterator j)
{
data = alloc.allocate(j - i);
limit = avail = uninitialized_copy(i, j, data);
}

void Str::uncreate()
{
if (data) {
iterator it = avail;
while (it != data)
alloc.destroy(--it);

alloc.deallocate(data, limit - data);
}

data = limit = avail = 0;
cout << "UNCREATED" << endl;
}

ostream& operator<<(ostream& os, const Str& s) {
for (Str::size_type i = 0; i != s.size(); i++)
os << s[i];
return os;

}

最佳答案

除其他事项外,您缺少 Str 的复制构造函数,但您确实在此处调用了它:

 result2 = makeList(greeting); // Pass by value -> copy

在这里:

 ret.push_back(s);  // Pass by value -> copy

没有它,将使用默认的复制构造函数,但它不会执行您想要的操作。可能的实现:

Str(const Str& other) 
{
create(other.begin(), other.end());
}

永远尊重the rule of three

关于c++ - 从 C++ 中的函数返回用户定义对象列表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24976433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com