想要理解一樣事物,就要先用自己的語言去描述一件事物。在我查閱資料后,發現malloc函數簡單說來就是空閑內存空間收集器,並把空閑空間關聯起來,用術語來說就是:將空閑內存塊合並起來並稱為"閑置鏈表"。然后在這塊空閑空間進行划分,划出用戶需要的與用戶不需要的。然后把用戶需要的給用戶,不需要的返還給"閑置鏈表"。而用戶使用free釋放時候也是扔回去的過程。但是這時候的空閑空間是間斷的片段,malloc函數就需要去整理整合這些片段,若空間達不到用戶需要,malloc就會返還NULL指針,告訴用戶空間不足。這就是為什么malloc需要檢驗返還值了。
那么new和malloc的工作機制到底有什么不同呢= =?通過查找,我翻到了new的源碼
1 void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) 2 { // 嘗試申請內存空間 3 void *p; //這個指針用於指向獲取到的空間,且返回該指針給調用方,且設置為void*是為了能夠指向任意格式 4 while ((p = malloc(size)) == 0) //利用malloc函數調用來申請內存空間,得到一個閑置鏈表 5 if (_callnewh(size) == 0) 6 { // 拋出沒內存的信息 7 _THROW_NCEE(_XSTD bad_alloc, ); 8 } 9 10 return (p); 11 }
我們可以看到new的實現方法也是通過malloc函數來實現的,但是它們之間有很多不同之處。通過對malloc的源碼進行查看
void *malloc (unsigned int size) { char *caddr; //雖然unsigned char* caddr是編譯器認可的最小內存申明,但這里我們使用 char * if (!malloc_ptr) return NULL; if ((malloc_ptr + size + sizeof(int)) > malloc_top) { prom_printf("malloc failed\n"); return NULL; } *(int *)malloc_ptr = size; caddr = malloc_ptr + sizeof(int); malloc_ptr += size + sizeof(int); last_alloc = caddr; malloc_ptr = (char *) ((((unsigned int) malloc_ptr) + 3) & (~3)); return caddr; }
可以粗略的看出,malloc函數是不會去計算用戶所需要的內存空間,需要用戶自己去計算自己需要的空間大小,例如在數組中,malloc是需要用戶自己給出計算后的大小,而new會額外儲存數組大小,不需要用戶再次進行計算。(參數表中的size_t,通常我們用sizeof(XXX)操作,這個操作所得到的結果就是size_t類型)。
也就是說,new 基於 malloc,卻又高於malloc,是它的一個提升版本。
在返回值上面,new和malloc函數的區別只是在於,new是拋錯,要判斷是否分配成功應該用異常捕獲的機制,而malloc函數在內存不夠時直接返還NULL。
由於個人能力有限,只能進行淺層次的對比。