關於老生常談的new、delete與malloc、free的區別
因為在面試的時候答得不太好,所以我就找了一些資料,想聊聊其中比較有意思的一些點
非常不意外地,我們在面試地時候被問到的c++問題中對於new與malloc的區別,當然在此我們僅討論一端的問題,也就是new與malloc的一些相同點與不同點
其實,new與malloc都是在堆區由程式設計師申請的記憶體,但是他們之間確實存在或多或少的一些區別,不過他們的目的比較明確,都是申請一段空間,接下來我們討論一些細節,不一定齊全但是希望能對或許正在讀的讀者有所幫助
先來看一段**
class a
a * ptr = new a;
a * ptr = (a *)malloc(sizeof(a));
這是分別使用new和malloc分配一段記憶體的情形
1.形式不同
new是在c++中的一種運算子,可以被過載,生成物件時會呼叫建構函式,在主函式return 0 後會呼叫析構函式,是很智慧型的,而malloc是c++/c中一種庫函式,在申請空間後需要人為地呼叫free函式,二者在表現形式上的不同使其在速度上有所差異,一般來說new比較快
2.返回型別不同
new申請記憶體之後返回的是對應型別的指標,而malloc僅僅是申請了指定大小的記憶體,而返回型別預設為void*,所以我們會看到
a * ptr = (a *)malloc(sizeof(a));
使用了強制型別轉換
3.申請大小不同
new申請記憶體的大小可以智慧型地進行計算,而malloc需要自行確定申請大小(比如用sizeof來算),而new則很好地可以這樣
int *a ;
a = new int[50];
來自己計算大小
4.申請記憶體失敗時表現
new記憶體分配失敗時預設丟擲異常,malloc記憶體分配失敗時會返回null
從前面可以看出來,new是非常智慧型的,不過我們在什麼情形下需要malloc呢,那自然是在c環境下無法呼叫new來分配記憶體,
使用new操作符來分配物件記憶體時會經歷三個步驟:
第一步:呼叫operator new 函式(對於陣列是operator new)分配一塊足夠大的,原始的,未命名的記憶體空間以便儲存特定型別的物件。
第二步:編譯器執行相應的建構函式以構造物件,並為其傳入初值。
第三部:物件構造完成後,返回乙個指向該物件的指標。
使用delete操作符來釋放物件記憶體時會經歷兩個步驟:
第一步:呼叫物件的析構函式。
第二步:編譯器呼叫operator delete(或operator delete)函式釋放記憶體空間。
c中malloc與new的區別
1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...
C 中new與malloc的區別
具體包括 參考鏈結 1.申請的記憶體所在位置 new操作符從自由儲存區 free store 上為物件動態分配記憶體空間,而malloc函式從堆上動態分配記憶體。自由儲存區是c 基於new操作符的乙個抽象概念,凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區。而堆是作業系統中的術語,是作業...
new與malloc的區別
1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...