面試題:C++有了malloc/free,爲什麼還需要new、delete?

1、面試寶典面試題(P81):C++有了malloc/free,爲什麼還需要new、delete?

malloc與free是C、C++語言的標準庫函數,new/delete是C++的運算符。他們都用於申請動態內存和釋放內存。

對於非內部數據類型的對象而言,只用malloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加給malloc/free。

因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。new/delete不是庫函數而是運算符

 

 

malloc 是C語言的標準庫函數,它實現了在堆內存管理中進行按需分配的機制,但是它不提供在C++中對像構造的支持,而new 則是一個 在C++中同時完成堆內存按需分配支持和對像構造功能的運算符,
(我這麼理解,malloc只能分配動態內存,而new除了分配動態內存還能構造對象,free只能釋放內存,而delete除了釋放內存還能執行析構函數
我們不要企圖用malloc/free來完成動態對象的內存管理,應該用new/delete。由於內部數據類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。
3) 既然new/delete的功能完全覆蓋了malloc/free,爲什麼C++不把malloc/free淘汰出局呢?這是因爲C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存。
如果用free釋放“new創建的動態對象”,那麼該對象因無法執行析構函數而可能導致程序出錯。如果用delete釋放“malloc申請的動態內存”,結果也會導致程序出錯,但是該程序的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。
2、共享型智能指針通過維護一個對資源的引用計數來實現多個智能指針對象使用同一資源,每當資源上新增一個智能指針對象的時候,引用計數就加1,智能指針對象析構的時候,引用計數減1,當引用計數減爲0的時候,釋放資源。
發佈了79 篇原創文章 · 獲贊 110 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章