最近找實習生,這個問題被問的太多了,所以想把最近被高頻率問到的東西整理一下,以備後續複習。
一、malloc和new的區別:
1、malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。
2、new可以認為是malloc加建構函式的執行。new出來的指標是直接帶型別資訊的。而malloc返回的都是void指標,需要進行強轉。
3、如果malloc失敗返回空指標,new失敗會拋乙個bad_alloc的異常
二、c++為什麼要使用new,new的底層也是呼叫了malloc
1、對於非內建型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。
2、、c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。
三、既然new可以替換malloc為什麼c++還要支援malloc?
c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。
四、malloc()到底從**得到了記憶體空間?
從堆裡面獲得空間。也就是說函式返回的指標是指向堆裡面的一塊記憶體。作業系統中有乙個記錄空閒記憶體位址的鍊錶。當作業系統收到程式的申請時,就會遍歷該鍊錶,然後就尋找第乙個空間大於所申請空間的堆結點,然後就將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。
五、new和delete的整個流程
第一步: 呼叫庫函式operator new,分配可以容納乙個student型別物件的原始的、無型別的記憶體;
第二步: 根據給定的實參,呼叫student類的建構函式,以構造乙個物件;
第三步: 返回在第二步中被構造物件的位址。
對應地,上面的delete表示式,也實際上做了2步工作:
第一步: 呼叫student類的析構函式,以銷毀物件。這一步完成後,物件已經被銷毀,但該物件占用的記憶體此時仍然沒有
返還給系統;
第二步: 呼叫庫函式operator delete,將已經被刪除物件所占用的記憶體交回給系統。
需要特別注意的是,new表示式和庫函式operator new不是一回事情,事實上,new表示式總是會呼叫更底層的庫函式operator new。delete表示式和庫函式operator delete之間的關係也與此類似。
new和malloc的區別
1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...
malloc和new的區別
1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...
new 和 malloc 的區別
new 和 malloc 的區別 1.malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2.對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動...