2014-03-03 46 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. 
} 

假設你寫了一個析構函數,這簡而言之就是,如果兩個對象指向同一個動態分配的內存成員會有什麼發生。

您將刪除相同的地址兩次(雙刪除錯誤),這樣做是未定義的行爲。更有可能的是,會發生崩潰。