私は通常「そうしないでください」と却下するこのフリンジの質問に出くわしましたが、標準で満足のいく答えを見つけることができなかったので、誰かが理由を指摘していただければ幸いです。
デストラクタで例外をスローするクラスがあるとします。
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で小さなテストを実行しました。(これをコンストラクターの例外と比較してください。この場合、割り当て解除関数が呼び出されることが保証されます(存在する場合)。)