c 動態記憶體的管理

2021-08-03 13:47:55 字數 2883 閱讀 4805

我們都知道在c++中可以用new/malloc動態分配記憶體空間用delete/free釋放動態開闢的記憶體空間。

c++中的malloc/free是繼承c語言中的malloc/free,它的用法和在c語言中的用法一模一樣。

1.那麼既然c++中有了可以動態開闢記憶體的函式為什麼又要有new/delete呢?

我們知道malloc只是單純的開闢記憶體空間而不進行初始化,free只是將動態開闢的記憶體空間給釋放了。

對於內建型別而言,用malloc/free開闢和釋放記憶體沒有一點問題,但是對於非內建型別來說,由於物件在建立的時候要呼叫建構函式進行初始化,而在物件在消亡的時候要呼叫析構函式進行一些清理工作,顯然,malloc/free無法完成這些事情。

因此,c++中提供了new/delete兩個操作符,用new在動態分配記憶體的時候呼叫建構函式進行初始化,delete在釋放記憶體的時候自動呼叫析構函式進行清理。

2.new/delete的用法

a為非內建型別

[cpp]view plain

copy

print?

class a  

~a()  

private:  

int _a;  

};  

class a

{public:

a(int a=0,int b=0)

:_a(a)

,_b(b)

{cout <

注意:

new和delete,new和delete一定要成對出現,在下面我們會解釋為什麼new和delete要成對出現。

3.new和delete的內部實現:

通過跟蹤除錯程式,我們可以知道new和delete內部是通過呼叫一些函式實現的。

new內部是通過呼叫以下函式實現的

char *  operatoer new(size_t count);

char * operator new(size_t count);

具體呼叫順序如下:

delete內部是通過呼叫以下兩個函式實現的:

void operator delete(char *p);

void operator delete(char *p);

具體呼叫順序如下:

4.new和delete,new和delete為什麼要成對出現?

1.malloc/free為防止記憶體洩漏,一定要成對出現。

2.new和delete成對出現的原因則是因為new開闢記憶體空間是呼叫建構函式建立物件,而如果不用delete釋放空間而是用free,那麼釋放空間之前不會執行析構函式,有可能會導致記憶體洩漏。、

a *pa=new a;

free(pa);//錯誤

delete pa;//正確

3.new和delete為什麼要成對出現呢?我們通過執行程式可以發現:

1.當我們用new開闢10個連續內建型別空間,而用delete釋放,這時執行程式,程式不會崩潰。

int *p=new int[10];

delete p;

2.當我們用new開闢10個連續的非內建型別的空間,沒有用delete釋放,執行程式時,程式會崩潰。

a* pa=new a[10];

delete pa;

這是為什麼呢?

當我們執行下面的程式,

我們發現執行

int *p=new int[10]開闢記憶體時傳給operator new(size_t count)的count是40;

a* pa=new a[10]開闢記憶體時傳給operator new(size_t count)的count是84;

這就說明了new在開闢內建型別的空間時,開闢得空間數量是指定的空間數量,位元組數是指定的數量乘以型別的大小。

而在開闢非內建型別空間時,除了開闢指定數量的空間以外,還多開闢4個位元組的空間。

new開闢非內建型別的空間時傳給operator new(size_t count)的count是型別的大小*空間的數量在加上4個位元組,最前面的空間裡放的是要執行析構函式的次數。它返回給a2的位址是最前面的空間的後乙個空間的位址。

由於內建型別沒有析構函式,因此沒有多開闢空間。

非內建型別用delete在釋放空間時呼叫operator delete(char *p),而此時的p被編譯器內部處理過後,它指向的是這些連續空間的最前面乙個空間的位址,因此,而傳給operator delete(char *p)的位址是處理過後的位址,因此,他可以釋放一塊連續的空間並且直到呼叫析構函式的次數。

而如果用delete,則直接呼叫operator delete(char *p),傳給p的位址是a2的位址,如果釋放它,就相當於釋放動態開闢空間的一部分,這樣會造成記憶體洩露,使程式崩潰,而編譯器不知道呼叫多少次析構函式。

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呼叫析構函式清理 釋...

c 動態記憶體管理

c語言動態記憶體管理 c中關於動態記憶體的標準庫函式 malloc calloc realloc free 以下是關於這幾個函式的介紹 1 malloc 用於動態開闢記憶體 堆空間 返回型別為void 引數 size t size 是無符號整型表示要開闢的空間大小,單位是位元組,2 calloc 用...