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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值