c++中通過new和delete運算子進行動態記憶體管理。
int *p1=new int;
int *p2=new int(3);//3將其初始化為3
int *p3=new int[3]//3表示物件個數。
delete p1;
delete p2;
delete p3;
malloc/free與new/delete的區別:
·malloc/free是c/c++標準庫的函式,而new/delete是c++操作符。
·malloc/free只是進行申請記憶體的分配,只能動態申請和釋放空間,而new/delete除了能夠申請空間和釋放空間,還會呼叫建構函式和析構函式進行初始化和清理工作。
·malloc/free需要手動計算申請的大小,new/delete可自己計算型別的大小,返回對應型別的指標。
操作符new:是乙個函式。new/delete與new/delete的實現是通過以下四個函式實現的,同時以下4個函式可以直接開闢空間
void * operator new (size_t size);
void operator delete (void* p);
void * operator new (size_t size);
void operator delete (void* p);
通過檢視這4個函式的原始碼,作出如下總結
1. operator new/operator delete operator new/operator delete 和 malloc/free用法一樣
2. 他們只負責分配空間/釋放空間,不會調調物件建構函式/析構函式來初始化/清理物件。
3. 實際operator new和operator delete只是malloc和free的一層封裝。
這四個函式是庫函式,並不是運算子的過載。
通過除錯:發現:
new做了兩件事情:1.呼叫opertor new()函式分配空間。2.呼叫建構函式初始化物件。
delete做了兩件事情:1.呼叫析構函式清理物件。2.釋放空間。
new :做了兩件事情:1.呼叫operator new函式分配空間。2.呼叫建構函式初始化物件。
delete做了兩件事情:1.呼叫析構函式清理物件,2.釋放空間。
另外:用delete時沒有給出次數,那編譯器是如何知道,要呼叫析構函式的次數呢?
在new 中會多出來的4個位元組是用來存放要開闢的物件個數的,將空間的的首位址向後偏移。
a p = new a[3]; int d = ((int*)p - 1);
注意:只有當為類的物件(內建型別)開闢空間,並且該類有自定義的析構函式時,才會有多出的4個位元組!
3.定位new表示式:
定位new表示式是在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件。
new(place_adress)type
new(place_adress)type(initializer-list)
place_adress必須為乙個指標,initializar-list是型別的初始化列表。
4.利用malloc和free實現new/delete/new/delete
class a
~a()
private:
int a;
};int main()
int n = *(int*)((pstart - 1));
for (int i = 0; i < n; i++)
//free((int*)pstart - 1);
operator
delete((int *)pstart - 1);//呼叫operator delete(char *)函式釋放記憶體空間
system("pause");
return
0;}
動態記憶體管理
首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...
動態 記憶體管理
定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整型物件,並返回此物件的位址,並用該位...
動態記憶體管理
c語言使用malloc calloc realloc free進行動態記憶體管理。void test c 通過new和delete動態管理記憶體。new delete動態管理物件。new delete動態管理物件陣列。void test void test int globalvar 1 stati...