C++ 在浅复制后调用析构函数将给出;中止陷阱:6“;错误

C++ 在浅复制后调用析构函数将给出;中止陷阱:6“;错误,c++,segmentation-fault,destructor,shallow-copy,C++,Segmentation Fault,Destructor,Shallow Copy,所以我有一个自我实现的linkedlist类。对于复制构造函数,它生成“深度复制”或基本上是linkedlist的副本。但是对于赋值运算符,我基本上已经这样做了 // assignment operator linked_list& linked_list::operator=(const linked_list& L){ // check for self assignment if(this != &L){ this->he

所以我有一个自我实现的linkedlist类。对于复制构造函数,它生成“深度复制”或基本上是linkedlist的副本。但是对于赋值运算符,我基本上已经这样做了

// 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;    
}
这是一个“浅拷贝”,所以当我创建一个新的linkedlist b并将其指向a时,b中的更改将反映在a中

但现在的问题是,当我调用一个动态分配节点的析构函数时,因为它们都指向同一个对象,并且其中一个析构函数在另一个之前被调用,我得到以下错误消息

edit.out(3537,0x106bcbdc0)malloc:**对象0x7fa430c018f0的错误:未分配要释放的指针

edit.out(3537,0x106bcbdc0)malloc:**在malloc\u error\u break中设置断点以进行调试 中止陷阱:6


我使用lldb来探测任何解决方案,但我无法估计将首先调用哪个对象析构函数,以及如何防止再次调用它。

如果您的复制构造函数和析构函数工作正常(意味着没有bug),则可以使用以下命令轻松编写赋值运算符:

#包括
//...
链表和链表::运算符=(常量链表和L)
{
如果(此!=&L)
{
链表温度(L);
标准:交换(压头、温度压头);
标准:交换(sz,临时sz);
}
归还*这个;
}
我假设
head
sz
是唯一的成员。如果您有其他成员,则还需要交换这些成员


简而言之,其工作方式是复制传入的
链接列表
。然后,只需将当前对象的内部构件与临时副本的内部构件交换即可。然后,临时拷贝将与旧的内部构件一起销毁。

如果拷贝构造函数和析构函数工作正常(意味着没有bug),则可以使用以下命令轻松编写赋值运算符:

#包括
//...
链表和链表::运算符=(常量链表和L)
{
如果(此!=&L)
{
链表温度(L);
标准:交换(压头、温度压头);
标准:交换(sz,临时sz);
}
归还*这个;
}
我假设
head
sz
是唯一的成员。如果您有其他成员,则还需要交换这些成员


简而言之,其工作方式是复制传入的
链接列表
。然后,只需将当前对象的内部构件与临时副本的内部构件交换即可。然后临时副本和旧的内部构件一起销毁。

您应该仔细阅读。进行浅层复制的赋值运算符没有意义。如果您使用
a=b
,您会期望
a
b
包含单独的副本,而不是将两者链接到一个副本。如果你想要一个副本有两个名字,你会使用一个引用,如果你想在不复制的情况下转移一个列表的所有权,你会移动。你的复制构造函数工作正常吗?如果是,析构函数是否正常工作?如果是,则赋值运算符只是一个副本和两个swap语句,实际上与您尝试的类似,但使用的是
std::swap
。此外,正如注释所示,赋值运算符进行浅层复制是违反直觉的,老实说,如果复制构造函数进行非浅层复制,则是一个bug。一个程序员,他完成了这个
链接列表;链表二(一)
期望类似于
链接列表的复制语义;链表二;二等于一您应该仔细阅读。进行浅层复制的赋值运算符没有意义。如果您使用
a=b
,您会期望
a
b
包含单独的副本,而不是将两者链接到一个副本。如果你想要一个副本有两个名字,你会使用一个引用,如果你想在不复制的情况下转移一个列表的所有权,你会移动。你的复制构造函数工作正常吗?如果是,析构函数是否正常工作?如果是,则赋值运算符只是一个副本和两个swap语句,实际上与您尝试的类似,但使用的是
std::swap
。此外,正如注释所示,赋值运算符进行浅层复制是违反直觉的,老实说,如果复制构造函数进行非浅层复制,则是一个bug。一个程序员,他完成了这个
链接列表;链表二(一)
期望类似于
链接列表的复制语义;链表二;二等于一
#include <algorithm>
//...
linked_list& linked_list::operator=(const linked_list& L)
{
    if (this != &L)
    {
        linked_list temp(L);
        std::swap(head, temp.head);
        std::swap(sz, temp.sz);
    }
    return *this;
}