C++中的new與delete簡單淺析

#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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章