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。

猜你喜欢

转载自blog.csdn.net/cyousui/article/details/17071935