所以我有一个自我实现的链表类。对于进行“深层复制”或基本上是链表副本的复制构造函数。但是对于赋值运算符,我基本上已经做到了]
// assignment operator
linked_list& linked_list::operator=(const linked_list& L){
// check for self assignment
if(this != &L){
this->head=L.head;
this->sz=L.sz;
}
return *this;
}
这将创建“浅表副本”,因此当我创建新的链表b并将其指向a时,b中的更改将反映在a中。
但是现在的问题是,当我调用一个动态分配节点的析构函数时,由于它们都指向同一对象,并且其中一个析构函数先于另一个被调用,所以我收到以下错误消息。
edit.out(3537,0x106bcbdc0)malloc:对象0x7fa430c018f0的***错误:未分配释放的指针
edit.out(3537,0x106bcbdc0)malloc:***在malloc_error_break中设置一个断点进行调试中止陷阱:6
我使用lldb来探究任何解决方案,但是估计哪些对象析构函数将首先被调用以及如何防止再次调用它是无法控制的。
如果您的复制构造函数和析构函数正常工作(表示no错误),那么可以使用copy / swap idiom轻松编写赋值运算符:
#include <algorithm>
//...
linked_list& linked_list::operator=(const linked_list& L)
{
linked_list temp(L);
if (this != &L)
{
std::swap(head, temp.head);
std::swap(sz, temp.sz);
}
return *this;
}
我假设head
和sz
是唯一的成员。如果您还有其他成员,则还需要swap
这些成员。