只要你使用正常形式的new和delete,运行期系统可以毫无问题地找出由于new分配失败后需要回收内存的delete。
一个带额外参数的operator new称为placement new,在指定位置上分配内存:
void* operator new(std::size_t, void* pMemory) throw();
但是如果你写了一个class专属的operator placement new,又写了一个正常形式的class专属operator delete,那么运行期系统不知道如何取消并恢复原先对operator new的调用,于是什么也不做。
规则很简单,如果一个带额外参数的operator new没有带相同额外参数的对应operator delete,那么当new的内存分配动作需要取消并恢复先前时就没有任何operator delete被调用。因此,为了避免内存泄露,有必要声明一个placement delete。
请记住
- 当你写一个placement operator new,请确定也写出了对应的placement operator delete。如果没有这样做,你的程序可能会发生内存泄漏。
- 当年你声明placement new和placement delete,请去欸的那个不要无疑是地遮蔽了它们地正常版本。