[英]C++ operator overloads and destructors
struct Node
{
int value
Node* next;
}
typedef List Node*
const Set operator +(const Set& a, const Set& b)
{
Set aSet;
List newList = mergeListsCopy(a.list, b.list);
aSet.list = newList;
return aSet;
}
class Set
{
public:
//method decs
private:
List list;
};
Set::~Set()
{
list = deleteList(list);
}
这段代码的内部工作非常精细,mergeListsCopy从两个单链表创建一个新列表,并指定指向列表的指针,该列表是aSet的私有变量。
问题是当返回aSet时,aSet.list是一些奇怪的毒药地址(在本例中为0xf)。
当我通过调试器运行它时,在运算符重载的范围内创建了一个Set,但是在本地也使用符号aSet创建了对此set的两个引用,在返回之前,程序跳转到析构函数,可能是为了无关的Set,但由于只有一个Set,它会被破坏。
当我评论出我的析构函数时,这个问题就消失了。 我做错了什么?
你需要遵循三规则 。
如果您需要自己显式声明析构函数 , 复制构造函数或复制赋值运算符 ,则可能需要显式声明它们中的所有三个。
在程序执行过程中,很可能会创建临时无名对象(通过调用隐式编译器生成的复制构造函数),当这些临时对象通过调用析构函数被销毁时,最终会弄乱链表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.