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的區別集錦 一、new 是c++中的操做符,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;
正確的作法是先聲明一個n維數組,每一個單元是指向char的指針,再分別對每一個單元分配內存.代碼以下 char **array=new char*[n]; 注意:上面代碼在釋放分配的內存時要特別注意。由於這是「深度內存分配」,因此釋放時,要對每一個單元裏的指針指向的內存予以釋放。釋放內存代碼以下: for(i=0;i delete[] array[i];
malloc函數 用法:#include <malloc.h> 功能:分配長度爲num_bytes字節的內存塊 說明:若是分配成功則返回指向被分配內存的指針,不然返回空指針NULL。 舉例: #include <syslib.h> clrscr(); // clear screen getchar(); 函數聲明(函數原型): 對其作一個特例補充
//注意是sizeof( sturct hostent )而不是sizeof( sturct hostent* ) if ( !hp ) //建議要加上這個內存分配成功與否的檢測
首先應該知道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++的 運算符。它們均可用於申請動態內存和釋放內存。 Obj(void){ cout << 「Initialization」 << endl; } 5.new的幾種用法: int *p=new int; //在自由存儲區開闢一個int變量 int *p=new int[10];//在自由存儲區開闢一個 int數組,有10個元素 int *p=new int(10);//在自由存儲區開闢一個int變量,並初始化爲10 |