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的类
时间: 2024-10-11 07:11:40