您可能正在考虑 operator delete 的放置和 nothrow 形式,它们具有签名:
void operator delete(void *, void *) throw();
void operator delete(void *, const std::nothrow_t&) throw();
void operator delete[](void *, void *) throw();
void operator delete[](void *, const std::nothrow_t&) throw();
这些在正常操作期间从不调用,但会在使用placement new 构造的对象的构造函数引发异常的情况下使用。通常,您不必定义它们,因为编译器已经在死对象的基类和成员上调用了析构函数,并且对于放置 new 没有要释放的内存。但是如果你重载placement new并且需要相应的操作符,则可以存在。
第二个参数并没有真正使用,只是区分普通的签名:
void operator delete(void *)
不过,这些不是 operator++ 的特殊伪参数。它们只是使用额外参数调用 new 的一般规则的一个实例,例如:
obj = new(x,y,z) Object(a,b,c)
将生成隐式代码以清除构造函数错误,这些错误将相同的附加参数传递给运算符 delete,其功能(大约)如下:
void *raw = operator new(sizeof(Object), x,y,z)
try {
obj = new(raw) Object(a,b,c);
} catch(...) {
operator delete(raw,x,y,z);
throw;
}