g ++またはclangで次のコードを検討すると、少なくともmain関数で例外がキャッチされないと、Guardクラスのデストラクタは呼び出されません。私はthewのグーグルを作った、と有用な情報を見つけられませんでした。GuardがC++で、例外がメインで扱われないときにデストラクタが呼び出されない
私はRAIIを実装するためにロットでガードクラスを使用します。したがって、特にセマフォーなどのリソースを扱う場合、これは非常に不調であることがわかりました。
しかし、C++では、例外がスローされたときにデストラクタを呼び出す必要があります。この動作は標準ですか、これはlibstdC++の実装ですか?
この件に関するお手伝いやアドバイスをありがとうございます。
#include<iostream>
#include<memory>
struct Guard
{
Guard()
: v(new int)
{
std::cout << "Guard()" << std::endl;
}
~Guard(){
std::cout << "~Guard()" << std::endl;
delete v;
}
private:
int *v;
};
void test(){
auto g = std::make_shared<Guard>();
throw("youch");
}
void test2(){
test();
}
int main(void){
// try{
test2();
// } catch(...){
// }
return 0;
}
P.私はデバッガで発行されたポイントまで例外をトレースすることができてうれしく思いますが、main関数にtry/catchブロックを追加したくありません。
この正確な回答ありがとうございます。私はこの未定義の振る舞いがかなりイライラしていると言わなければならない。確かに、私はRAIIがすべてのケースで動作することを確かめるために例外ハンドラを設定しなければならないことに気づいていませんでした。 – Thomas