繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM