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。请确定不要无意识地遮掩它们的正常版本.