gpt4 book ai didi

c++ - 通过析构函数删除时崩溃

转载 作者:行者123 更新时间:2023-12-04 05:22:23 25 4
gpt4 key购买 nike

在下面的程序中,我打算复制 char* line通过 strcpy 从一个对象到另一个对象的内容.
但是当程序结束时,obj2 的析构函数工作正常,但 obj 的 dtor崩溃。 gdb 显示 line 的不同地址对于这两个对象。

class MyClass {
public:
char *line;
MyClass() {
line = 0;
}
MyClass(const char *s) {
line = new char[strlen(s)+1];
strcpy(line, s);
}
~MyClass() {
delete[] line;
line = 0;
}
MyClass &operator=(const MyClass &other) {
delete[] line;
line = new char[other.len()+1];
strcpy(line, other.line);
return *this;
}
int len(void) const {return strlen(line);}
};

int main() {
MyClass obj("obj");
MyClass obj2 = obj;

最佳答案


MyClass obj2 = obj;

你没有任务,你有 复制 build .而你没有遵循 rules of three, five or zero因为你没有复制构造函数,所以默认生成的只会复制指针。

这意味着在此之后您有两个对象,其 line指针都指向完全相同的内存。一旦其中一个对象被破坏,因为它给另一个对象留下无效指针,这将导致未定义的行为。

天真的解决方案是添加一个复制构造函数,它对字符串本身进行深度复制,类似于您的赋值运算符正在执行的操作。

更好的解决方案是使用 std::string而不是你的字符串,并遵循零规则。

关于c++ - 通过析构函数删除时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59034738/

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