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被摧毁了。
当我评论我的析构函数时,这个问题就消失了。我做错了什么?
答案 0 :(得分:3)
您需要关注 Rule of Three 。
如果您需要自己明确声明析构函数,复制构造函数或复制赋值运算符,您可能需要明确声明所有三个他们。
在程序执行过程中,很可能会创建临时无名对象(通过调用隐式编译器生成的复制构造函数),当这些临时对象通过调用析构函数被破坏时,最终会弄乱链接列表。