原文鏈接: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}}