あなたはおそらく、次の署名を持つ演算子削除の配置および非スロー形式を考えています。
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();
これらは通常の操作中に呼び出されることはありませんが、配置 newで構築されているオブジェクトのコンストラクターが例外をスローする場合に使用されます。通常、コンパイラは死んだオブジェクトのベースとメンバーでデストラクタを既に呼び出しており、新しい配置のために解放するメモリがないため、それらを定義する必要はありません。ただし、placement new をオーバーロードしていて、対応する演算子が必要な場合は存在できます。
2 番目の引数は実際には使用されず、署名を通常のものと区別するだけです。
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;
}