1. 程式人生 > >c++ 動態記憶體管理 new/delete

c++ 動態記憶體管理 new/delete

c語言是通過使用malloc、calloc、realloc、free進行記憶體管理
malloc:直接開闢空間
calloc:開闢空間時會進行初始化
realloc:它的函式原型為”void *realloc(void *ptr,size_t size)”,當引數 *ptr為空時,realloc等價於malloc;realloc可用於擴容,需要重新開空間。
c++中使用new、delete來動態管理物件

void test{
int *p1 = new int;//動態分配1個int的空間大小
int *p2 = new int(3);//動態分配1個int的空間,並初始化為3
int *p3 = new
int[3];//動態分配3個int的空間,即12個位元組 delete p1;//使用delete對new開闢的空間進行釋放 delete p2; delete[] p3; }

new/delete和malloc/free要彼此對應使用,若亂用會造成記憶體洩漏;這兩組的區別在於:
1)malloc/free是c語言中的函式,而new/delete是c++中的操作符;
2)new/delete不需要標頭檔案支援,malloc/free需要;
3)它們都是動態記憶體管理的入口;
4)new建立的是一個物件,通過成員函式訪問;malloc得到的是一塊記憶體,通過指標訪問;
5) malloc/free要手動計算型別大小且返回值是void*,new/delete可自己計算型別大小,返回對應型別的指標。
6)使用new時不僅是動態分配記憶體,還有呼叫建構函式進行初始化,delete不僅釋放記憶體還會呼叫解構函式進行成員清理;而malloc/free只是進行記憶體分配和釋放;

c++中還有如下的動態記憶體分配介面:
void * operator new (size_t size);
void operator delete (size_t size);
void * operator new [](size_t size);
void operator delete[] (size_t size);
可以看出operator new/delete和new/delete的區別:前者是函式,後者只是操作符。

new操作符的執行過程是:
a)呼叫operator new分配空間;
b)呼叫建構函式初始化物件;
c)返回對應指標。

delete操作符的執行過程是:
a)呼叫operator delete釋放空間;
b)呼叫解構函式清理物件。

operator new/operator delete類似c語言中的malloc/free,只負責分配和釋放空間,不釣魚其他函式,但使用operator new分配的空間必須使用operator delete釋放。
operator new/operator delete和operator new[]/operator delete[]都可以過載,而new操作符不行。
operator new過載時返回型別要宣告為void*,第一個引數型別是要分配空間的大小,且過載時可以帶其他引數。如果類中沒有過載operator new,就要呼叫的全域性的::operator new來完成堆的分配。

使用new分配陣列,如A *p4 = new A[3]; 會直接呼叫全域性的operator new[](size_t size),不管A中是否有operator new[]的過載;而delete[]p卻會優先呼叫A::operator delete(如果A中有過載),
還需注意的是在operator new[](size_t size)中傳入的並不是sizeof(A)*3,是要在物件陣列的大小上加上一個資料大小,用於編譯器區分物件陣列指標和物件指標以及物件陣列大小,通常這個資料佔4個位元組,為一個int大小。