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