non-member opertor new:
void* operator new(std::size_t size) throw(std::bad_alloc);
non-member operator new的常规有:
1)入参size为0时,也返回一个合法的指针
2)分配内存失败时必须调用operator new的错误处理函数new_handler
3)如果new无法分配size大小的内存,就要抛出一个bad_alloc异常
下面是个non-member operator new伪码pseuocode:
void* operator new(std::size_t size) throw(std::bad_alloc)
{
using namespace std;
//如果用户申请0大小的内存,为了返回一个合法指针,我们将它视为1Byte来申请
if (size == 0)
{
size = 1;
}
while(true)
{
尝试分配size bytes;
if (分配成功)
return 内存地址;
//分配失败,调用错误处理函数new_handler
//此处机智使用了set_new_handler的返回值来构造set_new_handler的入参
std::new_handler handler = std::set_new_handler(0);
set_new_handler(handler);
if (handler) (*handler)();
else throw std::bad_alloc();
}
}
(完)