由于成员函数的名称会覆盖外围(比如基类的、或外围namespace)的同名函数,即使参数列表不相同。
所以应该必须避免让class的定制operator new/delete覆盖了外围同名函数new/delete
下面的“模板”类,可以解决同名函数new/delete被覆盖的问题,其他类可以通过继承此基类即可。
class CStdNewDelete
{
public:
//normal new/delete
void* operator new(std::size_t size) throw(std::bad_alloc)
{
return ::operator new(size);
}
void operator delete(void* buf)
{
::operator delete(buf);
}
//placement new/delete
void* operator new(std::size_t size, void* ptr) throw()
{
return ::operator new(size, ptr);
}
void operator delete(void* buf, void* ptr) throw()
{
::operator delete(buf, ptr);
}
//nothrow new/delete
void* operator new(std::size_t size, const std::nothrow_t &nt) throw()
{
return ::operator new(size, nt);
}
void operator delete(void* buf, const std::nothrow_t &nt) throw()
{
::operator delete(buf);
}
};
注:
1)当定制自己的placement new/delete时,请确定不要无意识地掩盖了他们的正常版本!!!!
如果定制了placement new后,如果没有定义operator new,会导致你无法使用char* buf = new char[32];这种标准形式的operator new操作符,
会提示没有定义operator new,而引导支出已经定义的只有placement new函数。
(完)