從內部入手,淺談malloc和new的區別


想要理解一樣事物,就要先用自己的語言去描述一件事物。在我查閱資料后,發現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。

由於個人能力有限,只能進行淺層次的對比。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM