我知道一個無效指針會導致未定義的行爲,但免費知道指針是否有效?free()'知道'傳遞的指針是有效的嗎?
自由列表中的每個塊的開頭處是否有校驗和? 類似:
if((*ptr) == 'CHECKSUM'))
free
else
do something undefined
我知道一個無效指針會導致未定義的行爲,但免費知道指針是否有效?free()'知道'傳遞的指針是有效的嗎?
自由列表中的每個塊的開頭處是否有校驗和? 類似:
if((*ptr) == 'CHECKSUM'))
free
else
do something undefined
我知道無效指針會導致不確定的行爲,但如何免費知道的指針是否有效呢?
唯一的檢查是指針是否爲空。如果它是一個空指針,則free(按規範)將不會執行任何操作。
否則,free
只是試圖「免費」的內存,使得假設它是內存malloc
,calloc
,或者realloc
,它可以使任何事情發生(通常是不好的事情)分配 - 因此「未定義的行爲。」
哦,那是快:)謝謝。 – ubuntumazze
這就是爲什麼總是在釋放指針後立即將指針設置爲NULL是個好主意。 –
它不知道。它只是假設它是有效的並且適當地行事。
如果這個假設是錯誤的,那麼重要結構的破壞可能已經發生 - 那麼會發生什麼,是未知的。因此未定義的行爲。
可能有。但總的來說,事實並非如此。對於許多實現,free
只是假定它的輸入是有效的,並且正確地前進,就好像這是真的。完全有權這樣做。
這就是爲什麼行爲是「未定義」的原因:如果指針無效,不可能預測會發生什麼。在執行free
的操作期間和/或稍後執行一些其他堆操作時,內存的隨機區域可能會被丟棄;潛在地導致無關代碼中的不可預測的行爲。該程序可能會在free
中立即崩潰,或稍後在一些明顯不相關的位置崩潰。
由於指針是無效的,free
嘗試讀取「簿記信息」,就好像指針是由malloc
和有效的,這通常會導致釋放由無效指針指向一些隨機地址,導致腐敗返回/崩潰等
通常,它不知道,只是崩潰(或腐敗的東西)。 –
在這裏找到你的問題的答案http://stackoverflow.com/questions/1119134/how-do-malloc-and-free-work – Viswesn
它不必知道。總的來說,可以假定參數是null(在這種情況下它什麼也不做)或者是一個指向由(或者似乎是)'malloc'獲得的對象的指針。 –