3

これは、デストラクタから例外をスローしても安全かどうかについての質問ではありません。

http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.9の状態:

「スタックの巻き戻し中に、これらすべてのスタックフレーム内のすべてのローカルオブジェクトが破棄されます。これらのデストラクタの1つが例外をスローした場合(たとえば、Barオブジェクトをスローした場合)、C++ランタイムシステムは勝てない状況にあります。バーに入れて、} catch(Foo e){に最初に向かった場所に行き着きますか?Fooを無視して、} catch(Bar e){ハンドラーを探す必要がありますか?良い答えはありません。どちらを選択しても情報が失われます。」

IE:スタックの巻き戻し中に別の例外がスローされた場合、「検索」するcatchハンドラーがあいまいであるため、ランタイムシステムは勝てない状況になります。

スタックの巻き戻し中にスローされる例外自体がtry/catchブロックにある場合、上記に「例外」はありますか?この場合、あいまいさはありません。

#include <iostream>
using namespace std;

class Component
{
public:
    ~Component()
    {
        cout << "In component destructor" << endl;
        try
        {
            throw 1;
        }
        catch (...)
        {
            cout << "Caught exception in component destructor" << endl;
        }
    }

};

class Container
{
public:
    ~Container()
    {
        cout << "In container destructor" << endl;
        Component component;
    }
}
    ;

int main()
{
    try
    {
        Container cont;
        throw 'a';
    }
    catch (...)
    {
        cout << "Caught main exception ok" << endl;
    }
return 0;
}

以下はそれを暗示していますが、関連するC++標準セクションを誰かが知っているかどうか疑問に思いました。

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr155.htm

「スタックの巻き戻し中にデストラクタが例外をスローし、その例外が処理されない場合、terminate()関数が呼び出されます。次の例はこれを示しています。」

4

1 に答える 1

7

コンポーネントデストラクタは安全です。引用しているルールは、例外がデストラクタから(つまり、デストラクタの呼び出し元に)スローされた場合にのみ適用されます。

編集:これは標準からの1つの関連する引用です(強調が追加されました)

注:スタックの巻き戻し中に呼び出されたデストラクタが例外を除いて終了した場合、std :: terminateが呼び出されます(15.5.1)。

于 2011-04-27T00:48:28.577 に答える