new和malloc的區別,malloc和new的區別是什麼?

2022-02-10 05:02:34 字數 5615 閱讀 9996

1樓:小資料的分析

參考以下程式分析說明 new 和 malloc 的區別:

1#include

2#include

3#include

4using namespace std;

5class t

69 ~t()

10 };

11int main()

12解答:

由第13、14行**可見,new,malloc均能完成動態分配乙個新的空間的功能,並把它的首位址交給乙個指標。區別在於:

1. new直接寫在型別t的前面,是c++中的乙個操作符,且直接分配t大小的記憶體空間。而malloc是c中的乙個函式,且需要借助於函式sizeof幫其判斷t型別的大小;

2. new直接返回乙個t型別的指標,而且會呼叫類中的建構函式。而malloc返回乙個void指標,需要在前面對其強制定義為乙個t型別的指標,不用呼叫建構函式。

3. new與delete搭配使用,delete會呼叫類中的析構函式對記憶體進行釋放。malloc則與free搭配,不呼叫析構函式。

2樓:

這是c/c++欄目吧⋯⋯我覺得它可能問的是c/c++裡面這兩個的不同

總體來說malloc是c語言的,new是c++的,區別還是很大的,首先來說第一點,c語言因為用不了new只能用malloc所以不說,但是c++是都可以用,不過應該只用new而不用malloc幾乎沒有例外

返回值有區別,假設malloc分配記憶體失敗會返回空指標,一般是null,如果new分配失敗那麼會throw乙個異常,叫std::bad_alloc,這是乙個最大的區別,當然了一般在例如windows系統下大部分時候可以認為記憶體是無限的,分配失敗的情況很少發生

malloc和new的區別是什麼?

3樓:次次次蛋黃公尺亞

malloc和new從申請的記憶體所在位置、返回型別安全性、記憶體分配失敗時的返回值、是否需要指定記憶體大小這四點區分。

1、申請的記憶體所在位置不同

new操作符從自由儲存區(free store)上為物件動態分配記憶體空間。自由儲存區是c++基於new操作符的乙個抽象概念,凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區。

malloc函式從堆上動態分配記憶體。堆是作業系統中的術語,是作業系統所維護的一塊特殊記憶體,用於程式的記憶體動態分配,c語言使用malloc從堆上分配記憶體,使用free釋放已分配的對應記憶體。

2、返回型別安全性不同

new操作符記憶體分配成功時,返回的是物件型別的指標,型別嚴格與物件匹配,無須進行型別轉換,故new是符合型別安全性的操作符。

malloc記憶體分配成功則是返回void * ,需要通過強制型別轉換將void*指標轉換成我們需要的型別。

3、記憶體分配失敗時的返回值不同

new記憶體分配失敗時,會丟擲bac_alloc異常,它不會返回null。

malloc分配記憶體失敗時返回null。

4、是否需要指定記憶體大小不同

使用new操作符申請記憶體分配時無須指定記憶體塊的大小,編譯器會根據型別資訊自行計算。

malloc則需要顯式地指出所需記憶體的尺寸。

4樓:

malloc 是c語言的標準庫函式,它實現了在堆記憶體管理中進行按需分配的機制,但是它不提供在c++中對像構造的支援,而new 則是乙個 在c++中同時完成堆記憶體按需分配支援和對像構造功能的運算子,由於c++中的運算子功能較c中的運算子在意義上作了擴充套件的,可以理解成函式呼叫 。 malloc則是底層的,new的實現中是呼叫了malloc來實現堆記憶體的統一管理的,因此,可以認為new 是malloc的擴充套件同根版,而且單從記憶體分配的功能上來說,它們是在同一塊記憶體區域內實現統一管理的

5樓:匿名使用者

malloc是c語言裡面申請記憶體空間的方法

new是c++裡面申請記憶體空間的方法,幾乎一樣

6樓:匿名使用者

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管理動態記憶體。

5、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不是庫函式。

c中malloc與new的區別

7樓:

new更強大,在c++裡就用new.

一般的分配記憶體空間,兩者都可以,看你喜歡了。

8樓:帥得有點壞

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

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

4、new 和 malloc效率比較

new 有三個字母, malloc有六個字母new可以認為是malloc加建構函式的執行。

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

而malloc返回的都是void指標。

new和malloc的區別 csdn

9樓:

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/delete 和malloc/free 的區別一般彙總

10樓:雨過天晴日丶

1 我認為new\delete和malloc\free最大區別是對物件的理解。

如果你使用

foo* foo = malloc(sizeof(foo));//foo是乙個類

初始化,那麼你將不會呼叫foo的構造方法,而只是單純的分配空間。而且我們只認為你是分配乙個空間,而不是想建立乙個物件。

foo* foo = new foo();則會呼叫foo的構造方法來初始化物件,也就是說你既要分配空間又要初始化這段空間,讓它變成乙個物件。

對於delete和free也有同樣的問題,就是delete會呼叫析構函式,free則不會。

說白了,new\delete玩的是物件,而malloc\free僅僅是記憶體空間而已

2 對於除去物件意外的其他情況,比如int和float等

int* array=new int[10];和int* array=malloc(sizeof(int)*10);只存在使用技巧的差別,沒有本質的差別。

3 最後也提醒你new\delete和malloc\free只能成對使用,不能混了。

11樓:

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

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

因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。

我們先看一看malloc/free和new/delete如何實現物件的動態記憶體管理,見示例7-8。

class obj

~obj(void)

void initialize(void)

void destroy(void)

};void usemallocfree(void)

void usenewdelete(void)

示例7-8 用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也一樣。

new3dsll和new3ds有什麼區別?

大小區別,小的可以換殼,大的屏大看著舒服,配置一樣的。3dsll和new3dsll區別 摘要。3dsll和new3dsll主要有效能 硬體 遊戲數量 3d體驗這幾種區別。1 效能上的區別 new3dsll 3d效果是全視角的,不像3dsll一定要在特定角度看,電池電量 執行速度 攝像頭清晰度等跟 3...

ma和mon的區別是什麼啊,法語中ma mon me 三者的區別?尤其是me是什麼時候用的?

ma mon 都是 我的 的意思。是法語中的主有形容詞,表領屬關係,內作用相當於英語中的形容容詞性物主代詞my 我的 區別是後面加的是陰性名詞還是陽性名詞。ma 陰性單數名詞 例 我的媽媽 ma m re 我的 ma photo mon 陽性單數名詞 例 我的爸爸 mon p re 我的自行車 mo...

三菱刀片槽型MA和MS什麼區別

數控刀具是指與先進高效的數控機床相配套使 用的各種刀具的總稱,是數控機床不可缺少的關鍵配套產品,數控刀具以其高效 精密 高速 耐磨和良好的綜合切削效能取代了傳統的刀具,再先進的數控機床沒有刀具尤如一堆廢鐵,有了刀具,但不具備與先進數控機床相匹配的良好切削效能,數控機床的使用效率會大打折扣,數控機床不...