条款51:编写new和delete时需固守常规
set_new_handler是设计newHandler的常用手段,寻找当前Handler的办法:
new_handler global_handler = set_new_handler(0);
set_new_handler(global_handler);
//调用
if(global_handler) (*global_handler)();
else throw std:bad_alloc();
上面代码并不是线程安全的,原因就在于set_new_handler这个地方,当设置成0,可能会对其他线程造成影响。这样做很拙劣,但是没有办法,没有办法获知现在的new handler,只能通过这种办法来做。
通常会将new内部做无限循环,一旦失败,调用new handler;如果没有new handler,则抛出异常。如果在class内,那么存在一旦被继承,那怎么办?通常在class内,new通常被定义成静态函数,那么一旦被继承,那么往往继承类和基类的大小不一样,那么需要检查参数大小。如果大小和基类不一致,直接交给::new处理就可以了。
在处理delete的时候还需要处理delete NULL指针的问题。同样,继承的问题需要考虑。另外,虚拟析构函数是值得注意的问题。