首页 > 代码库 > 【effective c++】定制new和delete
【effective c++】定制new和delete
operator new 和 operator delete只适合用来分配单一对象。array所用的内存由operator new[]分配出来,并由operator delete[] 释放。
1、了解new-handler的行为
当operator new无法满足某一内存分配需求时,它会先调用指定的错误处理函数(new-handler),然后抛出异常。可通过set_new_handler函数来设置new-handler。
namespace std { typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw(); }
为当前class提供专属new-handler,只需为它提供自己的set_new_handler和operator new即可。
class Widget { public: static std::new_handler set_new_handler(std::new_handler p) throw(); static void* operator new(std::size_t size) throw(std::bad_alloc); private: static std::new_handler currentHandler; }; std::new_handler Widget::currentHandler = 0; // 注意此处要返回之前使用的new_handler std::new_handler Widget::set_new_handler(std::new_handler p) throw() { std::new_handler oldHandler = currentHandler; currentHandler = p; return oldHandler; } void* Widget::operator new(std::size_t size) throw(std::bad_alloc) { NewHandlerHolder h(std::set_new_handler(currentHandler)); return ::operator new(size); } // 为确保原本的new-handler能够被重新安装回去, 运用资源管理对象 class NewHandlerHolder { public: explicit NewHandlerHolder(std::new_handler nh): handler(nh){} ~NewHandlerHolder(){ std::set_new_handler(handler); } private: std::new_handler handler; // 防止copy NewHandlerHolder(const NewHandlerHolder&); NewHandlerHolder& operator=(const NewHandlerHolder&); };
模板化:设定class专属的new-handler的类
【effective c++】定制new和delete
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。