2014-03-03 43 views
-2
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(); 

可有人请提供详细,直观的解释?谢谢!

+1

您需要显示析构函数的定义 – Chris

+0

不知何故,我认为“详细”和“直观”的解释是相反的。 – Almo

+0

我不认为它会崩溃,除非你的析构函数试图删除头成员。如果析构函数这样做,那么因为当两个对象都被破坏时,两个对象指向相同的东西,那么被指向的东西会被删除两次。 –

回答

0

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

+0

但是析构函数应该能够正确处理指针指向NULL的情况吗? – AmazingVal

+0

只有编码才能处理。并且'list_one'中的指针引用不会被'list_two'的析构函数设置为'NULL',所以'head'指针总会有问题。 – abiessu

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. 
} 

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

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