4

new がオーバーロードされているが、対応する delete が C++ にロードされていない場合に何が起こるか説明できますか?

4

1 に答える 1

5

これは、オブジェクトの構築で例外がスローされた場合にのみ問題となり、C++11 5.3.4/18 で説明されています。

明確に一致する割り当て解除関数が見つからない場合、例外を伝播してもオブジェクトのメモリは解放されません。[ 注: これは、呼び出された割り当て関数がメモリを割り当てない場合に適しています。そうしないと、メモリ リークが発生する可能性があります。—終わりのメモ]

例:

T * p = new (true, 'x', Blue) T("Jim");

Tthrowsのコンストラクターの場合、operator delete(void *, bool, char, enum Color)名前空間スコープまたは の静的メンバーとしてオーバーロードが必要Tです。この関数が存在しない場合、割り当て解除関数は呼び出されません。

メモにあるように、基本的にノーオペレーションである新しい配置関数の場合、これは問題にならない可能性があります。ただし、割り当て関数が重要な作業を行う場合、対応するクリーンアップ関数はありません。

于 2012-10-09T18:01:11.263 に答える