關於 malloc 函數和free 函數

原文鏈接:http://blog.csdn.net/zhangxaochen/article/details/8052128 


1. malloc 函數原型

void* malloc(unsigned int num_bytes);


函數接受一個無符號整形參數,表示需要申請的動態內存字節數; 返回值爲void指針,一般往往需要強制類型轉換,比如轉爲 char*。如果申請失敗則返回 NULL。

2. malloc 的參數
大多數情況下,不要手動指定具體數值,比如如果希望申請 128 個int 長度的緩衝區,一般寫作:

malloc(128*sizeof(int) );


這麼寫的好處有兩點,一是系統無關,不必考慮在什麼樣的計算機上,int究竟佔用幾個字節(比如16、32位的計算機上int分別佔2、4byte的區別,32、64位計算機的long分別佔4、8 byte的區別); 二是語義明確,如果你寫成 malloc(512),後面維護的時候,往往忘記這個究竟用來存儲128個int呢,還是512個char。

3. malloc vs. new operator
c++ 的 new 至少與 malloc 有三點不同:
一是返回類型確定。二是自動計算實際內存空間的大小。三是內存自動初始化

舉例說,比如申請 10 個 int 的 buffer,可以寫成:

int* buf=new int[10];



也可以寫成:

int* buf=(int*)malloc(10*sizeof(int) );


如前所述,new 不需要 (int*) 類型轉換,也不需要手動 sizeof(int) 計算。同時, buf 指向的內存運行時會自動初始化爲默認值, 注意,malloc 得到的內存,其數據是任意的,沒有初始化。

這麼一說, malloc 可以等價於 operator new(不是 new operator)。可以參考:

http://blog.csdn.net/zhangxaochen/article/details/8033503

4. malloc 用法規範

type* ptr;
if(NULL==(ptr=(type*)malloc(sizeof(type))) ){
 err("error happened");
 exit(1);
}
//do something....
free(ptr);
ptr=NULL;


5. 關於 malloc(0)
 linux 下允許 malloc(0) 這樣的寫法,因爲 它默認限定了 malloc的下限爲 16byte。 而像是 malloc(-1) 這樣的寫法是錯誤的

==========================================================
再談 free:
1. free 原型:

void free(void* p);


2. free 釋放內存,但不修改指針的值
 上面也提到過這樣的代碼:

free(ptr);
ptr=NULL;


free 釋放了 ptr 指向的內存,但是ptr指向的地址並沒有改變,所以使用 “ptr=NULL;” 來清空ptr,以免在之後誤用 ptr而產生難以察覺的bug

3. free 如何釋放內存? 怎麼知道要釋放的內存的長度?
存在即合理,malloc 肯定多做了什麼。。。
傳說 malloc 實際申請的內存,比傳參時指定的內存要大一點。多了的內存存儲了這樣一個結構體:

struct mem_control_block {
    int is_available;    //這是一個標記?
    int size;            //這是實際空間的大小
};


is_available 解釋下, 它告訴系統此內存是否可重新使用,比如 is_available=1; 就是把內存標記爲 系統可用的。看下面代碼,據說是free 的函數實現:

void free(void *ptr){
        struct mem_control_block *free;
        free = ptr - sizeof(struct mem_control_block);
        free->is_available = 1;
        return;
}


free 函數做了什麼? 它並沒有直接做“抹掉堆內存數據”之類的事情,僅僅是找到 mem_control_block 的位置, 標記 is_available=1, 就是申明“這塊內存我不用了,系統可以收回去給別人用”這樣簡單的事情。而系統可以根據 mem_control_block 裏的 size 記號判定收回多少字節的內存。
 

 原文鏈接:http://blog.csdn.net/zhangxaochen/article/details/8052128

{{OVER}}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章