內存分布
在C語言和C++中,程序內存被劃分成六個部分:
內核空間、棧、內存映射段、堆、數據段、代碼段
棧:又稱堆棧,主要為非靜態局部變量、函數參數、返回值等,棧的生長方向是向下生長的
內存映射段:高效的I/O映射方式,用于裝載一個共享的動態內存庫。用戶可以使用系統接口創建共享內存,用做進程間通信
堆:用于程序運行時的動態內存分配,堆的生長方向是向上生長的
數據段:儲存全局數據和靜態數據
代碼段:儲存可執行的代碼、只讀常量(const)
new、delete
?new與malloc函數等C語言中開辟空間的操作不同的是,new不需要自行計算空間大小和返回類型,同時在使用new進行自定義類型的空間開辟時,它會自動調用默認構造函數完成初始化
delete與free等不同之處在于:delete會自動調用自定義類型的析構函數
在申請自定義類型的空間時,new會調用構造函數,delete會調用析構函數,而malloc與 free不會
申請和釋放單個元素的空間,使用new和delete操作符
申請和釋放連續的空間,使用 new[] 和delete[]
?operator new與operator delete
operator new和operator delete為系統定義的全局函數
new和delete在底層分別調用了operator new和operator delete用來申請和釋放空間
operator new實際通過malloc來申請空間,當malloc申請成功時直接返回,失敗時拋異常
operator delete實際通過free來釋放空間,成功時直接返回,失敗時返回NULL
new的原理:先用operator new申請空間,在申請的空間上執行構造函數,完成對象的構造
delete的原理:在申請的空間上執行析構函數,完成對象的資源清理,再用operator delete釋放空間
new T[N]的原理:先用operator new[]函數,在operator new[]中實際調用operator new函數完成N個對象空間的申請,再在申請的空間上執行N次構造函數
delete[]的原理:先在釋放的對象空間上執行N次析構函數,完成N個對象中資源的清理,再調用operator delete[]釋放空間,實際在operator delete[]中調用operator delete來釋放空間
?malloc/free與new/delete的區別
共同點:都是從堆上申請空間,需要用戶手動釋放空間
不同點:1.malloc與free為函數,new與delete為操作符
2.malloc申請的空間不會初始化,new會初始化
3.malloc申請空間時需要手動計算空間大小并傳遞,new只需要在后面跟上空間的類型,若是申請多個對象,[]中指定對象個數即可
4.malloc返回值為void*,必須強制類型轉化,new不需要
5.malloc申請空間失敗時返回的NULL,使用時必須判空,new不需要判空但必須捕獲異常
6.申請自定義類型對象時,new/delete會執行默認的構造函數和析構函數,完成對象的初始化或資源釋放,而malloc/free不會