关于new-handler

首先要抱怨一下打开CSDN博客的速度,打开博客花了我十几分钟。

 

C++ Effective 3e 条款49:

原文:

If the global operator new was able to allocate enough memory for a Widget object, Widget's operator new returns a pointer to the allocated memory. The destructor for the object managing the global new-handler automatically restores the global new-handler to what it was prior to the call to Widget's operator new.

红色字体为侯捷翻译:

Widget 析构函数会管理global new-handler...

 

这么一翻译意思全变掉了,百思不得其解。本来global new-handler在global operator new 操作完之后,应该恢复为默认内置的global new-handler的。如果是Widget析构函数来管理,那么global new-handler在Widget析构前还是Widget 的new-handler,global new-handler完全依靠Widget对象析构的时刻了,这完全是误导。重新看了原文和下面的代码,才发现是定义一个保存global new-handler的类,该类的析构函数自动恢复global new-handler。看下面的代码很清楚:

管理new-handler的类:

class NewHandlerHolder { public:  explicit NewHandlerHolder(std::new_handler nh) // acquire current  :handler(nh) {} // new-handler  ~NewHandlerHolder() // release it  { std::set_new_handler(handler); } private:  std::new_handler handler; // remember it  NewHandlerHolder(const NewHandlerHolder&); // prevent copying  NewHandlerHolder&  operator=(const NewHandlerHolder&); };

 

在Widget的operator new中定义一个NewHandlerHolder 类型的自动变量,保存global new-handler,没有异常的话,离开函数前会自动析构自动变量,也就恢复了原来的global new-handler。

void * Widget::operator new(std::size_t size) throw(std::bad_alloc) {  NewHandlerHolder // install Widget's  h(std::set_new_handler(currentHandler)); // new-handler  return ::operator new(size); // allocate memory  // or throw } // restore global // new-handler

 

 

你可能感兴趣的:(关于new-handler)