3

私は通常「そうしないでください」と却下するこのフリンジの質問に出くわしましたが、標準で満足のいく答えを見つけることができなかったので、誰かが理由を指摘していただければ幸いです。

デストラクタで例外をスローするクラスがあるとします。

struct Foo { ~Foo() { throw std::runtime_error("Catch this!"); } };

このクラスの動的に割り当てられたインスタンスを削除すると、動的に割り当てられたメモリはどうなりますか?

auto p = new Foo;

try { delete p; }
catch (std::exception const &) { }

割り当て解除関数は呼び出されますか?なぜ?ブロックに追加operator delete(p);してこのコードを正しくすることはできますか?catch

メモリの割り当てを自動的に解除しないように見えるGCCで小さなテストを実行しました。(これをコンストラクターの例外と比較してください。この場合、割り当て解除関数が呼び出されることが保証されます(存在する場合)。)

4

1 に答える 1

6

標準によると(5.3.5p7):

delete-expressionのオペランドの値がnullポインター値でない場合、delete-expressionは割り当て解除関数を呼び出します。それ以外の場合は、割り当て解除関数が呼び出されるかどうかは指定されていません。[注:割り当て解除関数は、オブジェクトのデストラクタまたは配列の一部の要素が例外をスローするかどうかに関係なく呼び出されます。—エンドノート]

メモはあなたの質問に答えます。

于 2012-12-09T23:32:58.390 に答える