2012-06-21 57 views
0

我有一個用於刪除鏈接列表中的元素的小代碼片段。 下面是代碼:使用無邏輯刪除

if (head->data == num) { 
    delete head; 
    head = head->next; 
} 

能否請您給我解釋一下,爲什麼這個代碼工作。它刪除頭部並將頭部設置爲下一個元素。

當我看到這個,我認爲這不會工作,但它的工作。

+4

雖然它不是一個確切的重複,但概念是相同的...閱讀這個傳奇的答案由Eric Lippert http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-訪問範圍之外/ 6445794#6445794 – Aamir

+1

我想我們現在需要一個標籤「爲什麼做這個工作」 –

回答

7

這是未定義的行爲,所以任何事情都可能發生,包括出現工作。

當您調用delete時,您將釋放內存回操作系統。無法保證所有內容都被刪除或清除。所以內存可以保持與delete之前相同,但這只是偶然。訪問它會導致未定義的行爲。

這樣做的一個正確的做法是:

if (head->data == num) { 
    aux = head; 
    head = head->next; 
    delete aux; 
} 
+1

你能解釋爲什麼這可以確保內存被釋放嗎?另外,C的規則是否相同?即'aux = head; head = head-> next;免費(aux)'確保內存被釋放? – rajatkhanduja

+1

@rajatkhanduja內存在兩種情況下都被釋放。我的代碼不會遇到未定義的行爲,因爲您不再訪問無效指針。 - 在你調用'delete'之後你不能訪問指針。 –

+0

哦!所以它更像是一種很好的編碼習慣。謝謝 ! – rajatkhanduja

2

OS可能會推遲內存段無效。您會發現刪除小內存部件並不健全,您只能使用一個內存段,因此刪除一次更爲有效。

0

從已經被刪除或釋放的內存中訪問數據並非都是可取的。有些時候它可能工作,但行爲是未定義的。