2012-06-12 16 views
3

我知道一個無效指針會導致未定義的行爲,但免費知道指針是否有效?free()'知道'傳遞的指針是有效的嗎?

自由列表中的每個塊的開頭處是否有校驗和? 類似:

if((*ptr) == 'CHECKSUM')) 
    free 
else 
    do something undefined 
+4

通常,它不知道,只是崩潰(或腐敗的東西)。 –

+0

在這裏找到你的問題的答案http://stackoverflow.com/questions/1119134/how-do-malloc-and-free-work – Viswesn

+0

它不必知道。總的來說,可以假定參數是null(在這種情況下它什麼也不做)或者是一個指向由(或者似乎是)'malloc'獲得的對象的指針。 –

回答

5

我知道無效指針會導致不確定的行爲,但如何免費知道的指針是否有效呢?

唯一的檢查是指針是否爲空。如果它是一個空指針,則free(按規範)將不會執行任何操作。

否則,free只是試圖「免費」的內存,使得假設它是內存malloccalloc,或者realloc,它可以使任何事情發生(通常是不好的事情)分配 - 因此「未定義的行爲。」

+0

哦,那是快:)謝謝。 – ubuntumazze

+0

這就是爲什麼總是在釋放指針後立即將指針設置爲NULL是個好主意。 –

2

它不知道。它只是假設它是有效的並且適當地行事。

如果這個假設是錯誤的,那麼重要結構的破壞可能已經發生 - 那麼會發生什麼,是未知的。因此未定義的行爲。

4

可能有。但總的來說,事實並非如此。對於許多實現,free只是假定它的輸入是有效的,並且正確地前進,就好像這是真的。完全有權這樣做。

這就是爲什麼行爲是「未定義」的原因:如果指針無效,不可能預測會發生什麼。在執行free的操作期間和/或稍後執行一些其他堆操作時,內存的隨機區域可能會被丟棄;潛在地導致無關代碼中的不可預測的行爲。該程序可能會在free中立即崩潰,或稍後在一些明顯不相關的位置崩潰。

1

由於指針是無效的,free嘗試讀取「簿記信息」,就好像指針是由malloc和有效的,這通常會導致釋放由無效指針指向一些隨機地址,導致腐敗返回/崩潰等

相關問題