C語言 free() 記憶體釋放問題
我們知道free(p)是釋放掉p所指向的記憶體,那麼是釋放了多長的一段記憶體呢?我們的系統是如何知道要釋放多少記憶體的呢?下面我來講講這個問題。
請看下面一段程式碼
顯然, pchar 和 pint 均被分配了4個位元組的記憶體。
那麼:
(1) free(pchar);
(2) free(pint);
這兩條語句是釋放了多少的記憶體呢?
語句(1)中是釋放了8個位元組的記憶體還是1個char資料所佔的記憶體?
語句(2)中是釋放了8個位元組的記憶體還是1個int資料所佔的記憶體呢?
實際上,無論是語句(1)還是語句(2)都釋放了8個位元組記憶體,和他所指向的資料型別沒有關係。決定free(p)釋放多大的記憶體塊,是在malloc的時候就已經確定了的,大多數實現分配儲存空間的時候實際所分配的空間會比要求的大一些,額外的分配的空間會用來記錄管理資訊,比如分配塊的長度,指向下一個分配塊的指標等等...所以說你malloc分配了多少空間,free的時候就會釋放相對應的空間大小。
再看下面一段程式碼
上面這段程式碼或許能夠正常執行,但實際上是錯誤的。
上面這段程式碼沒什麼問題,問題出在下面的程式碼上
我們已經知道呼叫free的時候釋放記憶體的大小是在malloc的時候就確定下來了的,一旦指標指向了malloc所分配的那段記憶體,記憶體釋放的時候就會釋放在malloc時所申請的那段大小(本例中是1000位元組),如果改變了指標的指向,比如向後或者向前移動了一段位置,程式執行時往往會出現錯誤,而且該錯誤極其隱蔽。
上圖給出了非常直觀的圖示便於理解。
作者本人水平有限,錯誤之處還望之處,謝謝!
作者宣告:
本人 ZhangZeyu對以上所有任何內容和資料享有版權
轉載請註明作者本人ZhangZeyu 及出處
向您的厚道致敬。謝謝!