free函式與記憶體管理

2021-06-20 23:31:46 字數 1600 閱讀 7804

new:分配記憶體+呼叫建構函式;

delete:釋放記憶體+呼叫析構函式;

malloc:分配記憶體;

free:釋放記憶體;

// free函式在msdn中的原型

void free(void * memblock);

functionrequired headercompatibility

free,

ansi, win 95, win nt

return value

none

parameter

memblock

previously allocated memory block to be freed

free函式釋放一塊由指標memblock指向的記憶體區域,即,將這塊記憶體區域還給作業系統,使其重新成為作業系統可利用的記憶體資源,這就是為什麼我們常說:「如果不使用free釋放malloc分配在堆中的記憶體會造成記憶體洩露,記憶體洩露將造成作業系統的記憶體資源逐步減少」。

注意:是作業系統的記憶體資源,而不是實際的物理記憶體,實際的物理記憶體不會減少,windows為每個程式提供4g的記憶體定址空間,這只是個定址空間,並不是說每個程式分配4g記憶體,這4g記憶體中,前2g為系統空間,後2g為使用者空間,因此使用者**部分實際可用定址空間只有2g,如果你總是malloc,而從不free,則會造成作業系統分配給你的記憶體越來越多,儘管你已經不用了,但是只要你的程式還在執行,你將越佔越多,直至你的程式結束,作業系統才會**那些記憶體資源,重新分配給其他程式。

例如:char * p = (char *)malloc(sizeof(char) * 10);

free(p);

這樣的結果是:指標p指向的記憶體空間將被作業系統**重新成為可分配資源,其內容將迅速被其他資料覆蓋,而此時在函式棧中分配的指標p的值卻沒有改變,見p152,仍然指向這塊記憶體區域,因此,此時最好不要再使用p來向這塊記憶體區域寫入資料,並且,一般在free後,這個指標變成了乙個懸垂指標(dangling pointer),術語見《c++ primer 第4版》p162,索引條目188,懸垂指標是指向曾經存在的物件的指標,但該物件已經不存在了,懸垂指標容易導致程式錯誤,而且這種錯誤很難檢測出來,因此,在p152中建議一旦使用delete或者free刪除了指標所指向的物件,應立即將指標置為0,這樣就非常清楚地表明指標不在指向任何物件。

經常會造成記憶體洩露的一種情況是:指標p所指向的記憶體區域中有指標q,指標q所指向的記憶體區域將得不到釋放,從而造成記憶體洩露。

free只能釋放引數指標所指向的記憶體空間,但是對於引數指標所指向的記憶體空間中的指標所指向的記憶體空間則無法釋放,如果free引數指標指向結構體例項或類物件,則如果結構體或類物件有析構函式,會造成記憶體洩露,必須使用delete來釋放;而如果結構體或類物件中沒有析構函式,則無論使用free還是delete都會造成記憶體洩露。珍貴做法是,對於new分配的自由儲存區中的結構體或類物件,盡量提供析構函式,然後使用delete來釋放記憶體,上述情形大多針對結構體而言,類物件一般會有析構函式,而結構體則不然,且析構函式必須進行類內指標的delete操作和free操作,否則即有析構函式也是沒用的。

free 顯示記憶體

free命令可以顯示當前系統未使用的和已使用的記憶體數目,還可以顯示被核心使用的記憶體緩衝區。free 選項 b 以byte為單位顯示記憶體使用情況 k 以kb為單位顯示記憶體使用情況 m 以mb為單位顯示記憶體使用情況 o 不顯示緩衝區調節列 s 間隔秒數 持續觀察記憶體使用狀況 t 顯示記憶體總...

malloc與free函式用法

在c裡,記憶體管理是通過專門的函式來實現。另外,為了相容各種程式語言,作業系統提供的介面通常是c 語言寫成的函式宣告 windows 本身也由c和組合語言寫成 1分配記憶體malloc函式 需要包含標頭檔案 include 函式宣告 函式原型 void malloc int size 說明 mall...

c 語言 malloch函式與free函式

void malloc size t size 動態記憶體分配 從堆 heap 中申請一塊長度略大於size長度的記憶體以作使用,如果不使用free 釋放,申請的記憶體會一直存在,我們稱之為 記憶體洩漏 注意 在申請記憶體時,要根據你想要的記憶體大小進行分配,有點像廢話。看一下 第6行,malloc...