2014-03-12 51 views
1

我知道這些代碼行正在做什麼,並且當我想要delete a Node時它似乎正常工作。關於刪除節點

temp = current->next; 
current->next = current->next->next; 
delete temp; 

然而,有人可以給我解釋一下,如果你這樣做到底發生了什麼:

delete current->next; 
current->next = current->next->next;    

我可以「得太多」,但是當我delete current->next,我會刪除那些未來指向的內容或指針next?因爲當我做第二位代碼時,我顯然會遇到錯誤。 但是,爲什麼我不能改變next指向的位置後面我什麼current->next指向?我只想深入瞭解我在做什麼。

+0

有錯誤是不是你試圖給它一個新的價值。這是您嘗試賦予它的新價值,它涉及您通過剛剛刪除的節點。 – BoBTFish

+0

當然哦!如果是這種情況,那麼我認爲它現在非常合理! :) 謝謝。 – user3411397

回答

0

一旦您調用delete,就不要求存儲器包含任何有效的內容。可能刪除的數據仍然與調用delete之前的數據相同,但這是未定義的行爲,您不能依賴它。

因爲您可以依賴有效的數據,所以嘗試閱讀它會導致垃圾回收或導致某種形式的訪問衝突。

0

您使用指針引用的在免費店分配的內存區域(也被稱爲,雖然術語是指不同的地方)。

假設你這樣說

int* p = new int{42}; 

這裏會發生什麼情況是,至少sizeof(int)字節的內存塊被保留某處,並使用可變p引用它。請注意,該區域的記憶沒有真正的名字;您只需使用p來操縱其內容。

現在好了,當你說

delete p; 

你是不是刪除p,而是的內存區域是p。您可以(理論上)在上述語句後使用p,但任何嘗試對其進行解引用都會導致未定義的行爲。

在你的情況,

delete current->next; 

導致由該指針引用的內存區域被釋放,因此下面的語句

current->next = current->next->next; 

是不是一個好主意,因爲current->next不再有效。