C語言 free() 記憶體釋放問題

2020-08-10 14:04:10

轉載:https://blog.csdn.net/Zzy_ZhangZeyu_/article/details/24848569

 

我們知道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位元組),如果改變了指針的指向,比如向後或者向前移動了一段位置,程式執行時往往會出現錯誤,而且該錯誤極其隱蔽。

 

上圖給出了非常直觀的圖示便於理解。