2013-03-27 73 views
-2

好吧。我用一個簡單的鏈接列表代碼付款。簡單鏈接列表代碼上的奇怪結果

我把頭節點保持公開。然後我聲明一個指針(head2)來存儲第一個列表的頭節點(第一個)到主程序中。我聲明第二個名爲second的列表,並將head2指定爲第二個列表的頭節點。然後我刪除head2。然後我訪問「第二個」(其頭節點被刪除)的成員並打印出來。我預料會出現分段錯誤。 但它的工作原理是,只爲頭節點的數據打印0。令我費解的是,如果頭節點被刪除,頭節點的下一個指針如何仍然在內存中? (這是由印刷通過list.I遍歷訪問正在使用克++ 4.6.1在Ubuntu.Here是代碼:

#include<iostream> 

struct Node 
{ 
    int data; 
    Node* next; 
}; 

class list1 
{ 
public: 
    list1(); 
    Node* head; 
    void insert(int); 
    void print(); 
}; 

list1::list1() 
{ 
    head=NULL; 
} 

void list1::insert(int a) 
{ 
    Node* newnode=new Node; 
    newnode->data=a; 
    newnode->next=head; 
    head=newnode; 
} 

void list1::print() 
{ 
    Node* dummy=head; 
    while(dummy) 
    { 
     std::cout<<dummy->data<<std::endl; 
     dummy=dummy->next; 
    } 
} 

int main() 
{ 
    list1 first; 
    first.insert(1); 
    first.insert(2); 
    first.insert(4); 
    first.insert(9); 

    list1 second; 
    Node* head2=new Node; 
    head2=first.head; 
    second.head=head2; 
    delete head2; 
    second.print(); 
    return 0; 
} 
+2

你會做得很好谷歌**「C++未定義的行爲」** – WhozCraig 2013-03-27 03:08:39

回答

2

您的代碼通過訪問對象,它們的壽命結束調用未定義的行爲

沒有什麼奇怪的是,它仍然可以正常工作。

未定義行爲意味着什麼事情都可能發生,包括您看到的是什麼。

1

刪除存儲只是意味着返回存儲系統,並返回內存已準備好被分配但是內存中的數據仍然存在,直到內存被覆蓋。由於你的程序已經刪除了內存,並且你的程序不知道什麼時候和誰將再次分配內存塊。因此,對於您的程序,仍然使用內存會導致未定義的行爲。

+0

非常感謝。這很清楚。 – xkcd83 2013-03-27 13:48:23

+0

@ xkcd83如果我回答了您的問題,請點擊正確的標誌接受我的回答。這會增加我的聲譽。 – TieDad 2013-03-27 14:12:18