c 動態記憶體管理

2021-08-20 18:50:06 字數 1960 閱讀 4690

與c語言不通,c++更多使用new和delete進行記憶體管理

int *p=new int;//開闢1個整型大小的空間,並由p指向它。

int *p1=new int(3);//開闢1個整型大小的空間並初始化為3,由p1指向它。

int *p2=new int[2];//開闢2個整型大小的空間,並由p2指向它。

delete p;

delete p1; //釋放p,p1,p2指向的空間。

delete p2;

能夠發現,new/delete對應單個變數的記憶體開闢,new[ ]/delete[ ]對應陣列的開闢。使用時一定要記得對應,不然可能會出現記憶體洩漏甚至崩潰的問題。

我們發現,c++是相容c的,在c++程式裡使用malloc/ free一樣可以開闢空間,那為什麼還要使用new/delete呢?

new/delete 和 malloc/free 的區別和聯絡

上述的區別與聯絡中,需要重點了解的是第三條,看看下面的**:

可以看出new在建立物件的同時已經呼叫了析構函式進行初始化。

operator new/operator delete operator new/operator delete 和 malloc/free用法一樣。

他們只負責分配空間/釋放空間,不會呼叫物件建構函式/析構函式來初始化/清理物件。

實際operator new和operator delete只是malloc和free的一層封裝。

new做了兩件事

呼叫operator new分配空間。

呼叫建構函式初始化物件。

delete也做了兩件事

呼叫析構函式清理物件

呼叫operator delete釋放空間

new[n]

呼叫operator new分配空間。

呼叫n次建構函式分別初始化每個物件。

delete[ ]

呼叫n次析構函式清理物件。(思考這裡怎麼n是怎麼來的?)

呼叫operator delete釋放空間。

這裡就有乙個問題了:在使用delete [ ]釋放空間的時候,編譯器怎麼知道該呼叫多少次析構函式呢?

原來在用new[ ] 開闢多個物件的空間時,系統在該開闢記憶體大小前多分配了4個位元組的記憶體,用來存物件的個數,這樣在delete[ ]時,就能取到物件的個數了。

但是在c++編譯器中,在如下情況下就不會開闢:

以下情況均有定義析構函式:

new 和delete[ ]:

new開闢了1個物件的空間,不會多分配4個位元組存物件個數,而delete[ ] 會誤認為開闢了多個物件,會去訪問前面的那4個位元組,這就屬於非法訪問,系統會報錯

new[ ]和 delete

new[ ]開闢了多個物件的空間,而delete誤認為只開闢了1個物件的空間,所以,在free時首位址出現錯誤,無法正常釋放空間。

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