malloc與new的區別

2021-07-14 06:17:47 字數 3283 閱讀 9312

1. malloc()

函式

1.1 malloc

的全稱是memory allocation,中文叫動態記憶體分配。

原型:extern void *malloc(unsigned int num_bytes);
說明:分配長度為num_bytes位元組的記憶體塊。如果分配成功則返回指向被分配記憶體的指標,分配失敗返回空指標null。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
1.2 void *malloc(int size);
說明:malloc 向系統申請分配指定size個位元組的記憶體空間,返回型別是 void* 型別。void* 表示未確定型別的指標。c,c++規定,void* 型別可以強制轉換為任何其它型別的指標。
備註:void* 表示未確定型別的指標,更明確的說是指申請記憶體空間時還不知道使用者是用這段空間來儲存什麼型別的資料(比如是char還是int或者...)
1.3 free
void free(void *firstbyte)

: 該函式是將之前用malloc分配的空間還給程式或者是作業系統,也就是釋放了這塊記憶體,讓它重新得到自由。

2. malloc

和new的區別

2.1 new

返回指定型別的指標,並且可以自動計算所需要大小。

比如:   

1) int *p;

p = new int; //

返回型別為int* 型別(整數型指標),分配大小為sizeof(int);   

或:   

int* parr;

parr = new int[100]; //

返回型別為 int* 型別(整數型指標),分配大小為 sizeof(int) * 100;   

2) 而 malloc 則必須要由我們計算位元組數,並且在返回後強行轉換為實際型別的指標。  

int* p;

p = (int *)malloc (sizeof(int)*128);//

分配128個(可根據實際需要替換該數值)整型儲存單元,並將這128個連續的整型儲存單元的首位址儲存到指標變數p中 

double*pd=(double *) malloc (sizeof(double)*12);//

分配12個double型儲存單元,並將首位址儲存到指標變數pd中

舉個例子:

malloc

版本:

char*str1,*str2;

str1=(char*)malloc(128);

str2=(char *)malloc(128);// 分配128個字元儲存單

//元,並將這128個連續的字元儲存單元的首位址儲存到指標變數str1中

free(str1);

free(str2);

new ,delete

版本:

char *str1, *str2;

str1= new char[128];

str2 = newchar[128];

deletestr1;

delete str2;

2.2 malloc

只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。

除了分配及最後釋放的方法不一樣以外,通過malloc或new得到指標,在其它操作上保持一致。

3.

有了malloc/free為什麼還要new/delete?

1) malloc

與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

2) 

對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。

因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。
我們不要企圖用malloc/free來完成動態物件的記憶體管理,應該用new/delete。由於內部資料型別的「物件」沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。
3) 

既然new/delete的功能完全覆蓋了malloc/free,為什麼c++不把malloc/free淘汰出局呢?這是因為c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。

如果用free釋放「new建立的動態物件」,那麼該物件因無法執行析構函式而可能導致程式出錯。如果用delete釋放「malloc申請的動態記憶體」,結果也會導致程式出錯,但是該程式的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。
3.

有了malloc/free為什麼還要new/delete?

1) malloc

與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。

2) 

對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。

因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。
我們不要企圖用malloc/free來完成動態物件的記憶體管理,應該用new/delete。由於內部資料型別的「物件」沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。
3) 

既然new/delete的功能完全覆蓋了malloc/free,為什麼c++不把malloc/free淘汰出局呢?這是因為c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。

如果用free釋放「new建立的動態物件」,那麼該物件因無法執行析構函式而可能導致程式出錯。如果用delete釋放「malloc申請的動態記憶體」,結果也會導致程式出錯,但是該程式的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。

new與malloc的區別

1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...

new與malloc的區別

malloc 與free 是c c 語言的標準庫函式,new delete 是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於 malloc...

Malloc與new 的區別

malloc與new 的區別 1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行...