1.当在类中声明了一个placement new(一个特定位置上的new),它接受了除std::size_t外的其他变量作为参数,则必须同样声明一个placement delete并且其参数与placement new相同以取得对应关系,这样当内存分配失败时C++编译器将调用与placement new相匹配的placement delete归还内存。
注意placement delete只有在“伴随placement new调用而触发的构造函数”出现异常时才会被调用,对一个已经存在的指针进行delete时不会调用它。
2.应当避免class专属的new掩盖客户期望的其他new,如通用版本的new或其基类中的new,方法是在适当的作用域中使用using声明式。
缺省情况下C++在global作用域中提供以下三种形式的operator new:
void* operator new(std::size_t) throw(std::bad_alloc); //normal new void* operator new(std::size_t, void*) throw(); //placement new void* operator new(std::size_t, const std::nothrow_t&) throw(); //nothrow new
如果在类内声明专属的operator new,会遮掩上述版本。一般情况下应当保证这些函数在类外可用,同时应当声明成对的operator new和operator delete。可以声明一个基类包含所有上述函数及其对应的operator delete函数,自己定义类继承这个基类并使用using声明式以取得标准形式,使其与自定义版本不发生命名冲突。