std::set_new_handler(globalhandler); return memory; } // this sets each currenthandler to 0
template new_handler newhandlersupport::currenthandler; 有了这个模板类,对类x加上set_new_handler功能就很简单了:只要让x从newhandlersupport继续: // note inheritance from mixin base class template. (see // my article on counting objects for information on why // private inheritance might be preferable here.) class x: public newhandlersupport {
... // as before, but no declarations for }; // set_new_handler or operator new
这个例子说明了一个普遍原则:operator new和operator delete必须同时写,这样才不会出现不同的假设。假如写了一个自己的内存分配程序,就要同时写一个释放程序。(关于为什么要遵循这条规定的另一个理由,参见article on counting objects一文的the sidebar on placement章节)
因而,继续设计airplane类如下:
class airplane { // 和前面的一样,只不过增加了一个 public: // operator delete的声明 ...
所有一切都很好,但从你皱起的眉头我可以知道你一定在担心内存泄露。有着大量开发经验的你不会没注重到,airplane的operator new调用::operator new 得到了大块内存,但airplane的operator delete却没有释放它们。内存泄露!内存泄露!我分明听见了警钟在你脑海里回响。