C C 記憶體管理

2021-09-09 08:39:04 字數 3095 閱讀 8845

在c和c++中,我們把記憶體分為6個區域:

核心空間(使用者**不能讀寫)。

棧。記憶體對映段(檔案對映,動態庫,匿名對映)。

堆。資料段(也叫靜態區,儲存全域性變數和靜態變數)。

**段(也叫常量區,儲存可執行**,唯讀常量/字串常量)。

棧又叫堆疊,非靜態區域性變數/函式引數/返回值等等,棧是向下增長的。

記憶體對映段是高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共享記憶體,做程序間通訊。

堆用於程式執行時動態記憶體分配,堆是可以上增長的。

資料段–儲存全域性資料和靜態資料。

**段–可執行的**/唯讀常量。

malloc/calloc/realloc和free
malloc開闢一塊空間。

calloc開闢一塊空間並初始化為0。

realloc增加乙個已經開闢了的空間。

c語言記憶體管理方式在c++中可以繼續使用,但有些地方就無能為力而且使用起來比較麻煩,因此c++又提出 了自己的記憶體管理方式:通過new和delete操作符進行動態記憶體管理。

operator new與operator delete函式 :

operator new 實際也是通過malloc來申請空間,如果malloc申請空間成功就直接返回,否則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則就拋異常。

operator delete 最終是通過free來釋放空間的。

new和delete的使用方法:

new和delete是使用者進行動態記憶體申請和釋放的操作符,operator new 和operator delete是系統提供的全域性函式,new在底層呼叫operator new全域性函式來申請空間,delete在底層通過operator delete全域性函式來釋放空間。

void

test()

new的原理:

1.呼叫operator new函式申請空間 。

2.在申請的空間上執行建構函式,完成物件的構造 。

delete的原理:

1.在空間上執行析構函式,完成物件中資源的清理工作。

2.呼叫operator delete函式釋放物件的空間 。

new t[n]的原理:

1.用operator new函式,在operator new中實際呼叫operator new函式完成n個物件空間的申請。

2.在申請的空間上執行n次建構函式。

delete[ ]的原理:

1.在釋放的物件空間上執行n次析構函式,完成n個物件中資源的清理 。

2. 呼叫operator delete釋放空間,實際在operator delete中呼叫operator delete來釋放空間。

與malloc和free的區別:在申請自定義型別的空間時,new會呼叫建構函式,delete會呼叫析構函式,而malloc與free不會。

如果申請的是內建型別的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間,new和delete申請和釋放的是連續空間,而且new在申請空間失敗時會拋異常,malloc會返回null

注意:申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用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在釋放空間前會呼叫析構函式完成空間中資源的清理 。

new/delete比malloc和free的效率稍微低點,因為new/delete的底層封裝了malloc/free。

定位new表示式是在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件。

使用格式:

new (place_address) type

或者new (place_address) type(initializer-list)

place_address必須是乙個指標,initializer-list是型別的初始化列表。

eg:new(pt) test;// 注意:如果test類的建構函式有引數時,此處需要傳參 。

記憶體洩漏指因為疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並不是指內存在物理上的消失,而是應用程式分配某段記憶體後,因為設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。

c/c++程式中一般我們關心兩種方面的記憶體洩漏:

如何避免記憶體洩漏 :

工程前期良好的設計規範,養成良好的編碼規範,申請的記憶體空間記著匹配的去釋放。ps:這個理想狀態。但是如果碰上異常時,就算注意釋放了,還是可能會出問題。需要下一條智慧型指標來管理才***。

採用raii思想或者智慧型指標來管理資源。

有些公司內部規範使用內部實現的私有記憶體管理庫。這套庫自帶記憶體洩漏檢測的功能選項。

出問題了使用記憶體洩漏工具檢測。ps:不過很多任務具都不夠靠譜,或者收費昂貴。

總結一下:

記憶體洩漏非常常見,解決方案分為兩種:1.事前預防型。如智慧型指標等。2.事後查錯型。如洩漏檢測工具。

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...