Effective C++ 条款 52:写了placement new也要写placement delete(二)

2015-07-20 17:35:26 · 作者: · 浏览: 9
lass内声明任何operator news,它会遮掩上述这些标准形式。除非你的意思就是要阻止class的客户使用这些形式,否则确保他们在你生成的任何定制型operator new之外还可用。

解决所有问题的一个简单的做法是,建立一个base class,内含所有正常形式的new和delete:

class StandardNewDeleteForms{ 
public: 
    //normal new/delete 
    static void* operator new(std::size_t size)throw(std::bad_alloc) 
    {return ::operator new(size);} 
    static void operator delete(void* pMemory) throw() 
    {::operator delete(pMemory);} 
    //placement new/delete 
    static void*  operator new(std::size_t size, void* ptr) throw() 
    {return ::operator new(size, ptr);} 
    static void operator delete(void* pMemory, void* ptr)throw() 
    {return ::operator delete(pMemory, ptr);} 
    //nothrow new/delete 
    static void* operator new(std::size_t size, const std::nothrow_t& nt)throw() 
    {return ::operator new(size, nt);} 
    static void operator delete(void* pMemory, const std::nothrow_t&) throw() 
    {::operator delete(pMemory);} 
};

凡是想自定义形式扩充标准形式的客户,可利用继承机制及using声明式取得标准形式:

class Widget: public StandardNewDeleteForms{ 
public: 
    using StandardNewDeleteForms::operator new; 
    using StandardNewDeleteForms::operator delete; 
    static void* operator new(std::size_t size, std::ostream& logStream)throw(std::bad_alloc); 
    static void operator delete(void* pMemory, std::ostream& logStream) throw(); 
};



请记住:

(1)当你写一个placement operator new,请确定也写出了对应的placement operator delete.如果没有这样做。你的程序可能会发生隐微而时断时续的内存泄漏.
(2)当你声明placement new和placement delete。请确定不要无意识地遮掩它们的正常版本.