#include <iostream>
#include <cstdlib>
using namespace std;
/*
類名:Demo
*/
class Demo
{
public:
// Demo類的構造函數
Demo(){ cout << "Demo()" << endl; }
// Demo類的析構函數
~Demo(){ cout << "~Demo()" << endl; }
// 重載new運算符
static void* operator new(size_t bytes)
{
cout << "new Demo" << "\tbytes = " << bytes << endl;
if( 0 == bytes )
return NULL;
void *p = malloc(bytes);
return p;
}
// 重載delete運算符
static void operator delete(void* addr)
{
cout << "delete Demo" << endl;
if( NULL == addr )
return;
free(addr);
}
// 重載new[]運算符
static void* operator new[](size_t bytes)
{
cout << "new[] Demo" << "\tbytes = " << bytes << endl;
if( 0 == bytes )
return NULL;
void *p = malloc(bytes);
return p;
}
// 重載delete[]運算符
static void operator delete[](void* addr)
{
cout << "delete[] Demo" << endl;
if( NULL == addr )
return;
free(addr);
}
};
// 入口函數
int main()
{
cout << "===============================================" << endl;
Demo* p1 = new Demo; // 1.分配空間; 2.執行構造函數;
delete p1; // 1.執行析構函數; 2.釋放空間;
cout << "===============================================" << endl;
Demo* p2 = new Demo[5]; // 這裏會額外分配4個字節來保存分配空間個數
delete[] p2;
cout << "===============================================" << endl;
}
/*
執行結果:
===============================================
new Demo bytes = 1
Demo()
~Demo()
delete Demo
===============================================
new[] Demo bytes = 7 // 這裏會分配額外4個字節來保存分配空間的個數
Demo() // 以便通知delete來釋放多少個分配空間
Demo()
Demo()
~Demo()
~Demo()
~Demo()
delete[] Demo
===============================================
*/
分析:從上面程序執行結果可以看出,在C++中分配內存的最小單位爲1個字節,因爲計算機內存分配最小單位爲1個字節。當分配一組內存的時候,C++會爲分配內存額外開上一個4個字節大小的空間,這多出來的4個字節的空間是爲了通知delete應該釋放多少個空間。再補充一點:在C++中重載new和delete運算符無論加不加static修飾,C++都會認爲是static。
C++中的new與delete簡單淺析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.