0

重複の可能性:
コンストラクターが例外をスローした場合、デストラクタは呼び出されますか?

質問があります。コンストラクターが例外をスローしたときにデストラクタが実行されますか? サンプルコード:

#include <cstdio>

struct Test
{
    Test (void)
    {
        throw 100;
    }

    ~Test (void)
    {
        printf ("~Test\n");
    }
};

int main (void)
{
    try
    {
        Test test;
    }
    catch (int value)
    {

    }
}

このコードを実行すると、「~Test」は表示されません。わかりました、私はこの動作を理解するかもしれません。Test が動的に割り当てられたメンバーを持っていると仮定します。これらのメンバーは、コンストラクター内で割り当てられ、デストラクターで削除されます。コンストラクターで割り当てられた後に例外がスローされると、それらはどうなりますか?

4

3 に答える 3

2

スタックの巻き戻し中には、完全に構築されたオブジェクトのデストラクタのみが呼び出されます。コンストラクターが既に動的にメモリを割り当てた後にスローした場合、デストラクタは呼び出されず、リークします ( raw を使用したと仮定しますnew)。

ただし、expectation がスローされるまでに正常に構築されたメンバーのデストラクタは呼び出されます。raw の代わりにnewスマート ポインターまたはコンテナーを使用すると、リソースは適切にクリーンアップされます。

于 2012-11-08T10:51:38.327 に答える
0

これ(およびそのような場合に適切なリソース管理を行うための可能な方法)については、コンストラクターが例外をスローした場合にデストラクタが呼び出されますか?に非常に詳細な回答があります。

于 2012-11-08T10:52:19.387 に答える
0

いいえ、デストラクタは実行されません。ただし、正常に構築されたメンバー変数のデストラクタは実行されます。

于 2012-11-08T10:47:36.467 に答える