Effective C++第8章

请注意:STL容器所有使用的的heap内存是由容器所拥有的分配器对象管理,不是被new和delete直接管理。
条款49:了解 new-handler的行为
当 operator new无法满足某一内存分配需求时,她会抛出异常。以前它会返回一个null指针,某些旧式编译器目前还那么做。
当operator new 抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的new-handler。
namespace std{
    typedef void(*new_handler)();
    new_handler set_new_handler (new_handler p) throw();
}
设计一个良好的new-handler函数必须做以下事情:
让更多内存可被使用。程序一开始执行就分配一大块内存,而后当new-handler第一次被调用,将它们释放给程序。
安装另一个new-handler。目前这个new-handler就可以安装另外那个new-handler以替换自己。
卸除new-handler    也就是将null指针传给set_new_handler。一旦没有安装任何new-handler,operator,operator  new会在内存分配不成功时抛出异常。
抛出 bad_alloc的异常 这样的异常不会被operator new捕捉,因此会被传播到内存索求处。
不返回   通常调用abort或exit。
直至1993年,c++都还要求operator new必须在无法分配足够内存时返回null。新的一代operator new都应该抛出bad_alloc异常。c++标准***会不想抛弃
那些“侦测null”的族群,于是提供另一形式的operator new,负责供应传统的“分配失败便返回null”行为这个形式被称为“nothrow”形式------某种程度上是因为他们在new
的场合用了nothrow对象。
请记住:
set_new_handlder允许客户指定一个函数,在内存分配无法获得满足时被调用。
Nothrow new 是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可能抛出异常。


全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务