在c語言中,用malloc/realloc/calloc和free實現動態記憶體管理,malloc 申請記憶體,calloc 申請記憶體並初始化為0 ,realloc 重新分配記憶體,但在c++中則使用的是new和delete
舉個栗子:
int
main()
new 在申請記憶體時,失敗會丟擲異常,而且如果是申請的自定義型別,還會自動呼叫自定義型別的建構函式,delete針對自定義型別也會呼叫自定義型別的析構函式。
operator new 和 operator delete函式
operator new 和 operator delete函式是系統提供的全域性函式,new實際上呼叫operator new 函式來申請空間而delete 實際上通過operator delete釋放空間。而有意思的是,operator new 函式裡邊是用的 malloc 來申請記憶體的,operator delete 函式裡邊是用的 free 來釋放記憶體的。operator new 申請記憶體如果成功就直接返回,否則執行使用者提供的空間不足的對應措施,如果使用者沒有提供對應措施就會丟擲異常。
malloc / free 和 new / delete 的區別
malloc/free和new/delete的共同點是:都是從堆上申請空間,並且需要使用者手動釋放。不同的地方是:
malloc和free是函式,new和delete是操作符
malloc申請的空間不會初始化,new可以初始化
malloc申請空間時,需要手動計算空間大小並傳遞,new只需在其後跟上空間的型別即可
malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new後跟的是空間的型別
malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常
申請自定義型別物件時,malloc/free只會開闢空間,不會呼叫建構函式與析構函式,而new在申請空間後會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理
記憶體洩漏
什麼是記憶體洩漏,記憶體洩漏有什麼危害?
什麼是記憶體洩漏:記憶體洩漏指因為疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並不是指內存在物理上的消失,而是應用程式分配某段記憶體後,因為設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。
記憶體洩漏的危害:長期執行的程式出現記憶體洩漏,影響很大,如作業系統、後台服務等等,出現記憶體洩漏會導致響應越來越慢,最終卡死
記憶體洩漏的分類
c/c++程式中一般關心兩種方面的記憶體洩漏:
c c 記憶體管理
我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...
C C 記憶體管理
寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...
C C 記憶體管理
1.相同點 失敗 null 2 使用之前都要進行判斷是否為空 3 釋放空間的方式 free 4 返回值 void 可以強制型別轉換 2.不同點 1 malloc 引數 位元組數 功能 負責將空間給出 2 calloc 引數 單個元素位元組數,元素個數 功能 給出空間,且對空間進行初始化為0 若p為n...