//如果内存分配请求成功,就返回指向内存的指针;如果失败,抛出一个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;
}