深入剖析c 動態記憶體管理

2021-07-28 12:29:43 字數 1514 閱讀 5543

首先先看下圖了解程式是怎樣在記憶體中管理的:

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

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

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

4.資料段一儲存全域性資料和靜態資料。

5.**段可執行的**唯讀常量。

在c語言中我們動態分配記憶體使用malloc/free;在c++中沒有直接使用這種函式,而是使用new / delete 、new / delete

它們都是動態管理記憶體的入口,malloc / free是cc++標準庫的函式,new/ delete是c++操作符。

為什麼c++要使用new / delete 而不使用malloc/free?

因為 malloc / free只是動態分配記憶體空間釋放空間。而new/ delete除了分配空間還會呼叫建構函式和析構函式進行初始化與清理(清理成員),而且malloc/frec需要手動計算型別大小且返回值會void", new / delete可自己計算型別的大小,返回對應型別的指標。

下面剖析

new / delete 、new / delete是如何動態分配記憶體的:

●new做了兩件事1.呼叫 operator new分配空間。2.呼叫建構函式初始化物件。 ●

delete也做了兩件事呼叫析構函式清理物件2.呼叫 operator delete釋放空

●new[n]1.呼叫 operator new分配空間2.呼叫n次建構函式分別初始化每個物件。 ●

delete[n]1.呼叫n次析構函式清理物件。(思考這裡怎麼n是怎麼來的2.呼叫 operator delete釋放空間。

new在給內建型別開闢空間時,開闢的空間不會多4個位元組,而new在給自定義型別開闢空間時,而且還看是否有自定義析構函式,如果定義了析構函式才會多開闢四個位元組,用來判斷這裡要呼叫多少次析構函式;如果沒有自定義析構函式,就不會多開闢四個位元組了

下面是模擬new / delete 、new / delete是如何動態分配記憶體

#includeusing namespace std;

class a

~a()

private:

int _a;

};int main()

// deletep

int j = 0;

for (j = 0; j < *((int*)pb-1); j++) //顯式呼叫析構函式,通過*((int*)pb-1)可以判斷呼叫多少次析構函式

operator delete((int*)pb-1); //釋放所以開闢的空間

*/ a* p4 = new a[3];

delete p4;

return 0;

}

c 動態記憶體管理深入理解

c 的動態記憶體管理 c語言用3個函式進行動態記憶體分配。malloc申請一段連續的堆空間並返回首位址,不能初始化記憶體空間。calloc會將分配到的空間每一位初始化為0,因此效率稍低。realloc給乙個已經分配了位址的指標重新分配空間,realloc 擴大空間時,很有可能原有空間後的餘留空間不夠...

C 動態記憶體管理

我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...

C 動態記憶體管理

1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...