通过代码了解浅层复制

时间:2014-03-03 20:55:38

标签: c++

 class LinkedList {
 public:
      LinkedList();
      ~LinkedList();
      LinkedList& operator= (const LinkedList& other);
      void insert(int val); // adds a node
 private:
      LinkedListNode* head;
 };

使用默认赋值运算符

 list_one.head = list_two.head;

我的理解是list_one和list_two现在共享list_two最初指向的结构元素。

当下面的析构函数运行时会发生什么,为什么程序会崩溃?

 ~list_two();
 ~list_one();

有人可以提供详细的直观的解释吗?谢谢!

3 个答案:

答案 0 :(得分:1)

浅拷贝意味着您要复制位置而不是该位置的内容

所以,你有两个指向同一位置的指针。当您使用析构函数在同一位置释放(释放)两次内存时,就会发生崩溃。

答案 1 :(得分:1)

int main()
{
   int *p1 = new int;  // assume p1 is member of list 1, so you allocate memory
   int *p2 = p1;  // assume p2 is a member of list 2 and you did assignment.
   delete p1;    // now destructor for p1 gets called, so must delete memory
   delete p2;    // now destructor for p2 gets called.  
                 // also must delete dynamic memory.  Umm, Trouble here.
}

假设您编写了一个析构函数,简而言之,如果两个对象的成员指向同一个动态分配的内存,那将会发生什么。

您将删除相同的地址两次(双删除错误),这样做是未定义的行为。更有可能发生崩溃。

答案 2 :(得分:0)

删除list_two时,head节点指针及其指向的任何节点都应该(或应该被删除)。但是这些节点没有被复制到list_one,而是复制了head指针值,这意味着它指向了与list_one指向的节点相同的节点列表。因此,当删除list_one时,程序会尝试删除当前存储在list_one.head中的先前有效地址的先前有效对象。