C ++运算符重载和析构函数

时间:2012-03-26 07:12:18

标签: c++ reference operator-overloading destructor

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被摧毁了。

当我评论我的析构函数时,这个问题就消失了。我做错了什么?

1 个答案:

答案 0 :(得分:3)

您需要关注 Rule of Three

  

如果您需要自己明确声明析构函数复制构造函数复制赋值运算符,您可能需要明确声明所有三个他们。

在程序执行过程中,很可能会创建临时无名对象(通过调用隐式编译器生成的复制构造函数),当这些临时对象通过调用析构函数被破坏时,最终会弄乱链接列表。