1. 程式人生 > >C++中new和malloc的區別

C++中new和malloc的區別

1、new 是c++中的操作符,malloc是c 中的一個函式

2、new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的解構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫解構函式

3、記憶體洩漏對於malloc或者new都可以檢查出來的,區別在於new可以指明是那個檔案的那一行,而malloc沒有這些資訊。

4.new可以看成兩個動作:1。分配記憶體(相當於malloc)2。引發建構函式。

new   是個操作符,和什麼"+","-","="...有一樣的地位.

malloc是個分配記憶體的函式,供你呼叫的.

new是保留字,不需要標頭檔案支援.

malloc需要標頭檔案庫函式支援.

new   建立的是一個物件,

malloc分配的是一塊記憶體.

new建立的物件你可以把它當成一個普通的物件,用成員函式訪問,不要直接訪問它的地址空間

malloc分配的是一塊記憶體區域,就用指標訪問好了,而且還可以在裡面移動指標.

5、new 和 malloc效率比較

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

new可以認為是malloc加建構函式的執行。

new出來的指標是直接帶型別資訊的。

而malloc返回的都是void指標。

一:new delete 是運算子,malloc,free是函式

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

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

因此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函式只是負責分配記憶體。

相關推薦

C++newmalloc區別

1、new 是c++中的操作符,malloc是c 中的一個函式 2、new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的解構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫解構函式 3、記憶體洩漏對於mal

C語言中malloc/freeC++new/delete的區別

1. malloc()函式1.1 malloc的全稱是memory allocation,中文叫動態記憶體分配。原型:extern void *malloc(unsigned int num_bytes); 說明:分配長度為num_bytes位元組的記憶體塊。如果分配成功則返回指向被分配記憶體的指標,分配失敗

C語言 malloc/freeC++new/delete的區別

1. malloc()函式1.1 malloc的全稱是memory allocation,中文叫動態記憶體分配。原型:extern void *malloc(unsigned int num_bytes); 說明:分配長度為num_bytes位元組的記憶體塊。如果分配成功

C++ new malloc 區別

clas 區別 let void 操作符 類型 new 需要 調用 1.分配地方不同,malloc是堆上面,new是自由存儲區域 2.malloc/delete是函數,new/delete是操作符,可以重載 3.malloc 要指定大小,返回的是void*指針,開辟的是空空

C++】newmalloc區別

     之前的部落格中也有寫過new和malloc但是沒有系統的整理過。因為最近看面經經常會碰到面試官會問new和mmalloc的區別,所以在這裡整理一下,希望對大家有幫助。 new和malloc的區別可以從以下幾方面進行闡述: 最大的區別:new在申請空間的時候會

c++newdelete的區別

new 和delete 是運算子,而不是函式。 new new 運算子的格式: new 型別[初值]; new int; ///開闢一個存放整數的儲存空間,返回一個指向該儲存空間的地址

C/C++——C++newmalloc的10點區別

前言 幾個星期前去面試C++研發的實習崗位,面試官問了個問題: new與malloc有什麼區別? 這是個老生常談的問題。當時我回答new從自由儲存區上分配記憶體,malloc從堆上分配記憶體;new/delete會呼叫建構函式/解構函式對物件進行初始化與銷燬;

C#newoverride的區別

在C#中,override和new都會覆蓋父類中的方法。那它們兩者之前有什麼區別呢? override是指“覆蓋”,是指子類覆蓋了父類的方法。子類的物件無法再訪問父類中的該方法。 new是指“隱藏”,是指子類隱藏了父類的方法,當然,通過一定的轉換,可以在子類的物件中訪問父類的

C++newdelete之後發生了什麼

眾所周知,如果我們使用new向系統申請了記憶體,我們應該使用指標指向這一塊記憶體,俾能我們使用結束後,通過delete該指標釋放此記憶體資源。 如果理解只達到這種程度,在記憶體管理稍微複雜一點時便一定會束手無策。總有一些事情比其他事情更基本一點,現在我來談談當我們new和delete之後

C++newdelete的用法

new和delete運算子用於動態分配和撤銷記憶體的運算子 new用法:           1.     開闢單變數地址空間  

C++newdelete的背後

NewTest!wmain: 00aa1020 56              push    esi 00aa1021 6a04            push    4  00aa1023 e8b4030000      call    NewTest!operator new (00aa13d

c++區別

string.h string.h是C語言裡面關於字元陣列的函式定義的標頭檔案,常用函式有strlen、strcmp、strcpy等等,更詳細的資訊可以自己檢視(面向過程) cstring CString常用於MFC程式設計中,是屬於MFC的類,如從對話方塊中利用GetW

C++newdelete

New運算子 1、new表示式: 當我們使用一條new表示式時: string *sp=newstring(“a value”); string *arr=newstring[10]; 實際上執行了三步操作。第一步,new表示式呼叫一個名為operatornew(或者ope

C#closedispose區別

Close是停業整頓 Dispose是炸燬 停業了,可以通過公關,再重開。物還是原來的物 炸燬了,想再開張,就只有重頭建起 C#中解構函式是有垃圾蒐集器來呼叫的,當所引用的堆上的資料當無效時,會隱式呼叫。一般表現為當引用變數超出其作用域時就會呼叫。 Close函式和Dis

c++newdelete的預設賦值測試

  為了測試c++中對new操作符的運算規則是否呼叫預設物件的建構函式進行初始化,故寫出如下的測試demo: #include <iostream> using namespace std;

C++ #if #ifdef 區別

fde 編譯器 就是 開頭 編譯程序 如果 都是 條件 程序 以#開頭的都是預編譯指令,就是在正式編譯之前,編譯器做一些預處理的工作#if 條件語句程序段1 //如果條件語句成立,那麽就編譯程序段1#endif程序段2//如果條件不語句成立,那麽就編譯程序段2#ifndef

C++內存分配newmalloc區別

href 構造函數 alloc 拋出異常 delete 錯誤 malloc all oid 這裏有一篇講的很詳細new和malloc的區別 總結一下: 1.new/delete是操作符,malloc/free是函數 2.malloc分配內存需指定大小,且只能是一般數據

C#&&&,|||區別

.com blank img cnblogs png ref bsp 筆記 區別 當兩者都為邏輯運算符時。 其實沒什麽差別。 &&和||當已經確定結果時,不會對第二個操作數求值。也不知道什麽情況會用到這個差別。做個筆記好了。 http://blog.cs

C++typenameclass的區別

type .get true 能夠 class .... ray pla 依賴 在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢? 相信學習C++的人對class這個關鍵字都非常明白,clas

c#ClassStruct使用與性能的區別

回收 數據結構 com 垃圾回收 父類 改變 med .cn 指針 在Unity中很多已經定義為結構體的數據結構 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class為引用類型,Str