New與malloc的區別

http://blog.sina.com.cn/s/blog_6fc5bfa90100qgd7.html
1,malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們均可用於申請動態內存和釋放內存。
2, 對於非內部數據類型的對象而言,光用maloc/free沒法知足動態對象的要求。對象在建立的同時要自動執行構造函數,對象在消亡以前要自動執行析構函數。因爲malloc/free是庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函數和析構函數的任務強加於malloc/free。
3,所以C++語言須要一個能完成動態內存分配和初始化工做的運算符new,以一個能完成清理與釋放內存工做的運算符delete。注意new/delete不是庫函數。
4,C++程序常常要調用C函數,而C程序只能用malloc/free管理動態內存 new 是個操做符,和什麼"+","-","="...有同樣的地位 簡單的說: malloc,free是c的函數,new,delete是c++的運算符 此外,new是強制類型的,malloc不是,須要類型轉換 固然還有不少不一樣 new 能夠調用構造函數在聲明的時候初始化 malloc只是分配空間,須要在其餘地方初始化 而delete不只會釋放空間,在釋放前會調用析構函數 並且malloc須要指定分配空間大小, 而new是自動計算的

 

New與malloc的區別集錦
html

一、new 是c++中的操做符,malloc是c 中的一個函數

二、new 不止是分配內存,並且會調用類的構造函數,同理delete會調用類的析構函數,而malloc則只分配內存,不會進行初始化類成員的工做,一樣free 也不會調用析構函數

三、內存泄漏對於malloc或者new均可以檢查出來的,區別在於new能夠指明是那個文件的那一行,而malloc沒有這些信息。

四、new 和 malloc效率比較
c++

new 有三個字母, malloc有六個字母數組

new能夠認爲是malloc加構造函數的執行。函數

new出來的指針是直接帶類型信息的。spa

而malloc返回的都是void指針。指針

一:new delete 是運算符,malloc,free是函數htm

malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們 均可用於申請動態內存和釋放內存。對象

對於非內部數據類型的對象而言,光用maloc/free沒法知足動態對象的要求。對象在建立的同時 要自動執行構造函數,對象在消亡以前要自動執行析構函數。因爲malloc/free是庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函 數和析構函數的任務強加於malloc/free。blog

所以C++語言須要一個能完成動態內存分配和初始化工做的運算符new,以及一個能完成清理與釋放內 存工做的運算符delete。注意new/delete不是庫函數。內存

咱們先看一看malloc/free和new/delete如何實現對象的動態內存管理,見示例。

 

class Obj

{

public :

          Obj(void){ cout < < 「Initialization」 << endl; }

~Obj(void){ cout < < 「Destroy」 << endl; }

void      Initialize(void){ cout < < 「Initialization」 << endl; }

void      Destroy(void){ cout < < 「Destroy」 << endl; }

};

 

void UseMallocFree(void)

{

      Obj    *a = (obj *)malloc(sizeof(obj));     // 申請動態內存

      a->Initialize();                          // 初始化

      //…

      a->Destroy();     // 清除工做

      free(a);          // 釋放內存

}

 

void UseNewDelete(void)

{

      Obj    *a = new Obj;    // 申請動態內存而且初始化

      //…

      delete a;             // 清除而且釋放內存

}

示例用malloc/free和new/delete如何實現對象的動態內存管理

類Obj的函數Initialize模擬了構造函數的功能,函數Destroy模擬了析構函數的功 能。函數UseMallocFree中,因爲malloc/free不能執行構造函數與析構函數,必須調用成員函數Initialize和Destroy 來完成初始化與清除工做。函數UseNewDelete則簡單得多。

因此咱們不要企圖用malloc/free來完成動態對象的內存管理,應該用new/delete。 因爲內部數據類型的「對象」沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。

既然new/delete的功能徹底覆蓋了malloc/free,爲何C++不把malloc /free淘汰出局呢?這是由於C++程序常常要調用C函數,而C程序只能用malloc/free管理動態內存。

若是用free釋放「new建立的動態對象」,那麼該對象因沒法執行析構函數而可能致使程序出錯。如 果用delete釋放「malloc申請的動態內存」,理論上講程序不會出錯,可是該程序的可讀性不好。因此new/delete 必須配對使用,malloc/free也同樣。

二:new delete在實現上其實調用了malloc,free函數。

三:new operator除了分配內存,還要調用構造函數。

malloc函數只是負責分配內存。

 

///////////////////////////////////////

new 一維數組

XXX *arr;
int len; // 動態肯定該長度值

arr = new XXX[len]; // 動態分配,也可使用 malloc
...
delete[] arr; //不要忘記釋放


new 多維數組

正確的作法是先聲明一個n維數組,每一個單元是指向char的指針,再分別對每一個單元分配內存.代碼以下

char **array=new char*[n];
for(int i=0;i array[i]=new char[m];

注意:上面代碼在釋放分配的內存時要特別注意。由於這是「深度內存分配」,因此釋放時,要對每一個單元裏的指針指向的內存予以釋放。釋放內存代碼以下:

for(i=0;i      delete[] array[i];
delete[] array;

 

 

malloc函數
原型:extern void *malloc(unsigned int num_bytes);

用法:#include <malloc.h>

功能:分配長度爲num_bytes字節的內存塊

說明:若是分配成功則返回指向被分配內存的指針,不然返回空指針NULL。
當內存再也不使用時,應使用free()函數將內存塊釋放。

舉例:
// malloc.c

#include <syslib.h>
#include <malloc.h>
main()
{
char *p;

clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);

getchar();
return 0;
}

函數聲明(函數原型):
void *malloc(int size);
說明:malloc 向系統申請分配指定size個字節的內存空間。返回類型是 void* 類型。void* 表示未肯定類型的指針。C,C++規定,void* 類型能夠強制轉換爲任何其它類型的指針。
從函數聲明上能夠看出。malloc 和 new 至少有兩個不一樣: new 返回指定類型的指針,而且能夠自動計算所須要大小。好比:
int *p;
p = new int; //返回類型爲int* 類型(整數型指針),分配大小爲 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回類型爲 int* 類型(整數型指針),分配大小爲 sizeof(int) * 100;
而 malloc 則必須由咱們計算要字節數,而且在返回後強行轉換爲實際類型的指針。
int* p;
p = (int *) malloc (sizeof(int));
第1、malloc 函數返回的是 void * 類型,若是你寫成:p = malloc (sizeof(int)); 則程序沒法經過編譯,報錯:「不能將 void* 賦值給 int * 類型變量」。因此必須經過 (int *) 來將強制轉換。
第2、函數的實參爲 sizeof(int) ,用於指明一個整型數據須要的大小。若是你寫成:
int* p = (int *) malloc (1);
代碼也能經過編譯,但事實上只分配了1個字節大小的內存空間,當你往裏頭存入一個整數,就會有3個字節無家可歸,而直接「住進鄰居家」!形成的結果是後面 的內存中原有數據內容所有被清空。
malloc 也能夠達到 new [] 的效果,申請出一段連續的內存,方法無非是指定你所須要內存大小。
好比想分配100個int類型的空間:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配能夠放得下100個整數的內存空間。
另外有一點不能直接看出的區別是,malloc 只管分配內存,並不能對所得的內存進行初始化,因此獲得的一片新內存中,其值將是隨機的。
除了分配及最後釋放的方法不同之外,經過malloc或new獲得指針,在其它操做上保持一致。

對其作一個特例補充
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
此時獲得的是Got a valid pointer。把0賦給maclloc能獲得一個合法的指針。


struct hostent *hp;

//注意是sizeof( sturct hostent )而不是sizeof( sturct hostent* )
//其中N表明你須要的sturct hostent類型數據的數量
hp = ( struct hostent* ) malloc ( N * sizeof( sturct hostent ) );

if ( !hp )      //建議要加上這個內存分配成功與否的檢測
{
// 添加內存分配失敗時的處理方法
}


new delete, free malloc

首先應該知道malloc 和free是匹配的;new和delete是匹配的,他們不能夠混淆。   

malloc和new都申請空間,可是new是強類型的分配,會調用對象的構造函數初始化對象,而malloc僅分配內存空間可是不初始化。

new   自適應類型,malloc須要強制轉換new按類型進行分配,malloc須要指定內存大小對於對象來講free的確釋放了對象的內存,可是不調用對象的 析構函數。delete不只釋放對象的內存,而且調用對象的析構函數因此在對象中用free刪除new建立的對象,內存就有可能泄露在delete內部仍 調用了free .

補充一點:new和malloc雖然都是申請內存,但申請的位置不一樣,new的內存從free store分配,而malloc的內存從heap分配(詳情請看ISO14882的內存管理部分),free store和heap很類似,都是動態內存,可是位置不一樣,這就是爲何new出來的內存不能經過free來釋放的緣由。不過微軟編譯器並無很好的執行 標準,頗有可能把free store和heap混淆了,所以,free有時也能夠。

再補充一點:delete時候不須要檢查NULL

delete   NULL;      是沒有任何問題的,因此     

if(p)     

{                 

delete   p;                 

p   =   NULL;     

}     

還不如     

delete   p;     

p   =   NULL;

而free(NULL)那就麻煩大了。

1.malloc與free是C++/C語言的標準庫函數,new/delete是C++的 運算符。它們均可用於申請動態內存和釋放內存。
2.對於非內部數據類型的對象而言,光用maloc/free無 法知足動態對象的要求。對象在建立的同時要自動執行構造函數,對象在消亡以前要自動執行析構函數。因爲malloc/free是 庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函數和析構函數的任務強加於malloc/free。
3.C++語 言須要一個能完成動態內存分配和初始化工做的運算符new,以及一個能完成清理與釋放內存工做的運算符delete。 注意new/delete不是庫函數。
咱們先看一看malloc/free和new/delete如 何實現對象的動態內存管理,見示例7-8。
class Obj
{
public :

Obj(void){ cout << 「Initialization」 << endl; }
~Obj(void){ cout << 「Destroy」 << endl; }
void    Initialize(void){ cout << 「Initialization」 << endl; }
void    Destroy(void){ cout << 「Destroy」 << endl; }
};
void UseMallocFree(void)
{   Obj  *a = (obj *)malloc(sizeof(obj));   // 申請動態內存
    a->Initialize();                        // 初始化
//... a->Destroy();   // 清除工做
    free(a);        // 釋放內存
}
void UseNewDelete(void)
{
Obj  *a = new Obj;  // 申請動態內存而且初始化
     //...delete a;           // 清除而且釋放內存
}
示例7-8 用malloc/free和new/delete如 何實現對象的動態內存管理
類Obj的函數Initialize模 擬了構造函數的功能,函數Destroy模擬了析構函數的功能。函數UseMallocFree中, 因爲malloc/free不能執行構造函數與析構函數,必須調用成員函數Initialize和Destroy來 完成初始化與清除工做。函數UseNewDelete則簡單得多。

因此咱們不要企 圖用malloc/free來完成動態對象的內存管理,應該用new/delete。因爲內部數據 類型的「對象」沒有構造與析構的過程,對它們而言malloc/free和new/delete是 等價的。
4.既然new/delete的功能徹底覆蓋了malloc/free, 爲何C++不把malloc/free淘汰出局呢?這是由於C++程 序常常要調用C函數,而C程序只能用malloc/free管理動態內 存。

若是用free釋放「new建立的動態對象」,那 麼該對象因沒法執行析構函數而可能致使程序出錯。若是用delete釋放「malloc申請的動態 內存」,理論上講程序不會出錯,可是該程序的可讀性不好。因此new/delete必須配對使用,malloc/free也 同樣。

5.new的幾種用法:

int *p=new int; //在自由存儲區開闢一個int變量  int *p=new int[10];//在自由存儲區開闢一個 int數組,有10個元素 int *p=new int(10);//在自由存儲區開闢一個int變量,並初始化爲10
相關文章
相關標籤/搜索