new 重载的规范

	//如果内存分配请求成功,就返回指向内存的指针;如果失败,抛出一个std::bad_alloc类型的异常。
	//operator new实际上会不只一次地尝试着去分配内存,它要在每次失败后调用出错处理函数,还期望出错处理函数能想办法释放别处的内存。
	//只有在指向出错处理函数的指针为空的情况下,operator new才抛出异常。

	//非类成员形式的operator new的伪代码看起来会象下面这样:
	void * operator new(size_t size)				// operator new还可能有其它参数
	{                                       
		if (size == 0) 
		{										// 处理0字节请求时,
			size = 1;                           // 把它当作1个字节请求来处理
		}                                     
		while (1) {
			分配size字节内存;
			if (分配成功)
				return (指向内存的指针);

			// 分配不成功,找出当前出错处理函数
			new_handler globalhandler = set_new_handler(0);
			set_new_handler(globalhandler);

			if (globalhandler) (*globalhandler)();
			else throw std::bad_alloc();
		}
	}

//关于new_handler 
//	跳出循环的唯一办法是内存分配成功或出错处理函数new_handler完成了以下事件中的一种:
//  1.得到了更多的可用内存;删除其它无用的内存,使系统具有可以更多的内存可以使用,为下一步的内存申请作准备。
//  2.安装了一个新的new-handler(出错处理函数);如果当前的new-handler函数不能产生更多的可用内存,可能它会知道另一个new-handler函数可以提供更多的资源。
//  3.卸除了new-handler;也就是传递空指针给set_new_handler。没有安装new-handler,operator new分配内存不成功时就会抛出一个标准的std::bad_alloc类型的异常。
//  4.抛出了一个std::bad_alloc或其派生类型的异常;
//  5.没有返回。典型做法是调用abort或exit。

//类成员new的重载 ,使用new_handler处理异常
void* X::operator new( size_t size )
{
	new_handler globalhandler =				// 安装x的new_handler    
		std::set_new_handler( currenthandler);

	void *memory;

	try { 									// 尝试分配内存
		memory = ::operator new(tSize);
	}
	catch (std::bad_alloc&) { 				// 恢复旧的new_handler
		std::set_new_handler(globalhandler);      
		throw;	// 抛出异常
	}
	std::set_new_handler(globalhandler);	// 恢复旧的new_handler
	return memory;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值