在上一篇博客裏我們知道了new[]和delete[]開闢空間和釋放空間時過程,那麼我們可不可以模擬實現一下它們的開闢內存和釋放內存的過程呢?
下面是我模擬new[]和delete[]的實現過程:
根據上圖我們可以模擬new[]和delete[]的操作過程
#include<iostream> #include<stdlib.h> using namespace std; class A { public: A(int a = 0,int b = 0) :_a(a) , _b(b) { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } private: int _a; int _b; }; int main() { /*A *pa = new A[10]; delete[] pa;*/ A *pa = (A*)operator new(10 * sizeof(A)+4); *((int *)pa) = 10;//將第一個(佔用4個字節)空間賦值爲創建對象的個數 A *pStart = (A*)((int *)pa + 1); //new操作符返回的地址是開闢的連續空間的向後移4個字節之後的地址 for (int i = 0; i < 10; i++) { new(pStart + i)A(1, 0);// new表達式(placeement new) 形式(place_address)type(initializer-list) } int count = *((int *)pStart - 1); //計算開闢的連續內存空間最前面的佔用4個字節的空間中所存的釋放空間之前調用析構函數的次數 for (int i = 0; i < count; i++) { pStart[i].~A();//delete在釋放前自動調用析構函數 } operator delete[]((int *)pStart - 1);//調用operator delete[](char *)函數釋放內存空間 system("pause"); return 0; }
我們可以看到結果,調用10次構造函數,10次析構函數。