日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

malloc与new的区别

發布時間:2025/5/22 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 malloc与new的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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]; delete[]str1; 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也一樣。

?

?

?

?


?

?

?

?

總結

以上是生活随笔為你收集整理的malloc与new的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。