C語言中的malloc和free造成記憶體洩露?

2021-05-10 10:34:08 字數 1080 閱讀 6492

首先,說一下我對記憶體洩露的理解,記憶體洩露是指:程式中一塊不再使用的記憶體沒有被釋放,造成記憶體保持占用狀態,使作業系統不能將記憶體分配給其它的程式(程序)。在c語言,用的最多的管理記憶體的函式莫過於malloc和free了,下面我用vc6.0做了乙個小測試,原始碼如下:

然後,使用vc6.0來除錯這個程式,單步執行,對於這個程式,沒有step in的地方,除非你要想去看看malloc和free怎麼執行。我全部使用單步執行(step out)。下面有一些截圖:

圖1.執行完兩條malloc以後

從圖1可以看到,vc實現的malloc函式給連續宣告的兩個int變數分配的記憶體相隔很遠!

圖2.pint位址的內容

從圖2中可以看到,由於沒有給*pint賦值,所以這塊記憶體中的值為dirty。

現在將pint強制轉換成char *,然後賦給pchar,現在pchar和pint指向同乙個記憶體位址,現在給*pint賦值為16705,這個值是特別設計的,因為它的有效的兩個位元組轉化成ascii碼後是aa,從圖3中可以看出,當前pc上的記憶體是小端對其的。

圖3.給*pint賦值後

賦值以後檢視*pchar和pchar記憶體的內容,如下:

圖4.賦值以後的變數

從圖4中可以看到,*pchar表示乙個char值'a',而pchar是乙個字串"aa",因為char *可以指向乙個字串的首位址,而字串以字元'/0'結束,也就是整數0結束。而這時從圖3中可以看到,記憶體中的值為41410000...,轉換成ascii碼就是aa,然後跟上結束符。

現在該執行free了,如下圖

圖5.free(pchar)執行以後的記憶體圖

可以看到,free(pchar)這個char *一共free了9個位元組的記憶體!然後執行下一句,如下圖

圖6.free(pp)執行以後的記憶體圖

從圖6中可以看到,free乙個int*時,free掉了10個位元組的記憶體!

最後,從上面的實驗中是否可以得出下列結論呢?

1.malloc分配的記憶體至少要滿足請求的記憶體大小

2.即使兩個變數相鄰使用malloc分配獲得的記憶體位址也相隔甚遠

3.將int*強制轉換成char*後,會造成記憶體洩露(如上例中,有乙個位元組沒有被free掉)

c語言中的malloc

今天想去練習一下二叉樹的使用的,使用前就必須要建立乙個二叉樹啊。我用的是前序式的建立方法,都是通過呼叫子函式createtree來建立乙個樹 先建立根 左孩子 右孩子 是通過遞迴的方法的。但是當我測試的時候,每次訪問樹根的都會出錯,原來建立的二叉樹根本就沒有儲存在主函式的head中,我用單步除錯發現...

C語言中的malloc和free

最近在研究php自定義函式的實現,其中php自定義函式在傳遞引數時,是放到人為的乙個棧中,這個跟寫c程式時,引數入棧的這個棧還不一樣,其中延伸到了 malloc 以及free 有人說在free p 後,要將p設定為null,在查詢了一翻資料後,大體上弄明白了是怎麼回事 malloc是向os要一塊記憶...

c語言中calloc函式和malloc函式

1 void calloc unsigned int num,unsigned int size 記憶體的動態儲存區中分配num個長度為size的連續空間,返回所分配的記憶體空間的首位址 如果分配失敗,返回null。2 void malloc unsigned int size 動態分配記憶體 si...