2016-04-19 13 views
0

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ブロックを追加したくありません。

答えて

0

あなたは実装定義の動作を扱っています。標準パー[except.handle]

一致するハンドラが見つからない場合、機能std::terminate()が呼び出されます。スタックはstd::terminate()にこの呼び出しの前に巻き戻されているかどうかは実装定義である

ので gまたは使用しているどのような実装に基づいて破壊してもしなくてもよいです。あなたはこれを常に同じ方法で扱うことに頼ることはできません。

+0

この正確な回答ありがとうございます。私はこの未定義の振る舞いがかなりイライラしていると言わなければならない。確かに、私はRAIIがすべてのケースで動作することを確かめるために例外ハンドラを設定しなければならないことに気づいていませんでした。 – Thomas

関連する問題