您的位置:首页 > 运维架构

operator new之non-member operator new固守规则

2016-07-10 23:59 375 查看
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();
}

}

(完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: