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++中new和malloc的區別
1、new 是c++中的操作符,malloc是c 中的一個函式 2、new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的解構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫解構函式 3、記憶體洩漏對於mal
C語言中malloc/free和C++中new/delete的區別
1. malloc()函式1.1 malloc的全稱是memory allocation,中文叫動態記憶體分配。原型:extern void *malloc(unsigned int num_bytes); 說明:分配長度為num_bytes位元組的記憶體塊。如果分配成功則返回指向被分配記憶體的指標,分配失敗
C語言 malloc/free和C++中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++】new和malloc的區別
之前的部落格中也有寫過new和malloc但是沒有系統的整理過。因為最近看面經經常會碰到面試官會問new和mmalloc的區別,所以在這裡整理一下,希望對大家有幫助。 new和malloc的區別可以從以下幾方面進行闡述: 最大的區別:new在申請空間的時候會
c++中new和delete的區別
new 和delete 是運算子,而不是函式。 new new 運算子的格式: new 型別[初值]; new int; ///開闢一個存放整數的儲存空間,返回一個指向該儲存空間的地址
C/C++——C++中new與malloc的10點區別
前言 幾個星期前去面試C++研發的實習崗位,面試官問了個問題: new與malloc有什麼區別? 這是個老生常談的問題。當時我回答new從自由儲存區上分配記憶體,malloc從堆上分配記憶體;new/delete會呼叫建構函式/解構函式對物件進行初始化與銷燬;
C#中new和override的區別
在C#中,override和new都會覆蓋父類中的方法。那它們兩者之前有什麼區別呢? override是指“覆蓋”,是指子類覆蓋了父類的方法。子類的物件無法再訪問父類中的該方法。 new是指“隱藏”,是指子類隱藏了父類的方法,當然,通過一定的轉換,可以在子類的物件中訪問父類的
C++中new和delete之後發生了什麼
眾所周知,如果我們使用new向系統申請了記憶體,我們應該使用指標指向這一塊記憶體,俾能我們使用結束後,通過delete該指標釋放此記憶體資源。 如果理解只達到這種程度,在記憶體管理稍微複雜一點時便一定會束手無策。總有一些事情比其他事情更基本一點,現在我來談談當我們new和delete之後
C++中new和delete的用法
new和delete運算子用於動態分配和撤銷記憶體的運算子 new用法: 1. 開闢單變數地址空間  
C++中new和delete的背後
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++中new和delete
New運算子 1、new表示式: 當我們使用一條new表示式時: string *sp=newstring(“a value”); string *arr=newstring[10]; 實際上執行了三步操作。第一步,new表示式呼叫一個名為operatornew(或者ope
C#中close和dispose區別
Close是停業整頓 Dispose是炸燬 停業了,可以通過公關,再重開。物還是原來的物 炸燬了,想再開張,就只有重頭建起 C#中解構函式是有垃圾蒐集器來呼叫的,當所引用的堆上的資料當無效時,會隱式呼叫。一般表現為當引用變數超出其作用域時就會呼叫。 Close函式和Dis
c++中new和delete的預設賦值測試
為了測試c++中對new操作符的運算規則是否呼叫預設物件的建構函式進行初始化,故寫出如下的測試demo: #include <iostream> using namespace std;
C++中 #if 和 #ifdef 區別
fde 編譯器 就是 開頭 編譯程序 如果 都是 條件 程序 以#開頭的都是預編譯指令,就是在正式編譯之前,編譯器做一些預處理的工作#if 條件語句程序段1 //如果條件語句成立,那麽就編譯程序段1#endif程序段2//如果條件不語句成立,那麽就編譯程序段2#ifndef
C++內存分配new和malloc的區別
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++中typename和class的區別
type .get true 能夠 class .... ray pla 依賴 在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢? 相信學習C++的人對class這個關鍵字都非常明白,clas
c#中Class和Struct使用與性能的區別
回收 數據結構 com 垃圾回收 父類 改變 med .cn 指針 在Unity中很多已經定義為結構體的數據結構 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class為引用類型,Str