1、new是運算子,malloc是庫函式,需要標頭檔案(#include)
2、new有初始化的功能,malloc沒有
3、new和malloc都是申請記憶體的方式,但記憶體釋放方式不一樣,分別是delete和free
4、new返回的是與物件型別匹配的物件指標,malloc返回的是void*型別,需要型別強制轉換
5、new運算子可以被過載,malloc不可以
6、記憶體申請失敗的時候返回值不一樣,new返回bac_alloc異常,malloc返回空(null)
7、new操作符和malloc函式從堆上動態分配記憶體
為啥要有兩種不一樣的申請記憶體方式,有乙個不就夠了嗎?
對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求(物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式)
由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。
因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。
深拷貝和淺拷貝
淺拷貝(shallowcopy)只是增加了乙個指標指向已存在的記憶體位址,
深拷貝(deepcopy)是增加了乙個指標並且申請了乙個新的記憶體,使這個增加的指標指向這個新的記憶體,
深拷貝和淺拷貝最根本的區別在於是否真正獲取乙個物件的複製實體,而不是引用。
假設b複製了a,修改a的時候,看b是否發生變化:
如果b跟著也變了,說明是淺拷貝,拿人手短!(修改堆記憶體中的同乙個值)
如果b沒有改變,說明是深拷貝,自食其力!(修改堆記憶體中的不同的值)
深拷貝和淺拷貝的缺點
淺拷貝因為兩個物件的指標指向同一塊記憶體,這兩個物件指標生命週期結束的時候都會呼叫析構函式,那麼這一塊記憶體空間會被析構兩次,所以程式會崩潰。
如果改變乙個物件指標指向的值,另乙個物件指向的值也會改變,因為這兩個指標指向同一塊空間
解決淺拷貝的多次析構問題,可以在引用指標的時候加入引用計數---------智慧型指標
使用深拷貝拷貝資料的時候,消耗的資源更大。
參考部落格:
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無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動...