[C ++詳細分析] 49.コンストラクタとデストラクタの例外

記事ディレクトリ

1建設の異常

  • 構築プロセスはすぐに停止し、現在のオブジェクトを生成できません
  • デストラクタは呼び出されません
  • オブジェクトが占有していたスペースはすぐに再利用されます

推奨事項:コンストラクターで例外をスローしないでください。コンストラクターで例外が発生する可能性がある場合は、2次構築モードを使用してください

プログラミング実験:構築の例外

// 49-1.cpp
#include<iostream>
using namespace std;
class Test
{
public:
    Test()
    {
        cout << "Test()" << endl;
        throw 0;
    }
    virtual ~Test()
    {
        cout << "~Test()" << endl;
    }
};
int main()
{
    Test* p = reinterpret_cast<Test*>(1);
    try
    {
        p = new Test();
    }
    catch(...)
    {
        cout << "Exception" << endl;
    }
    cout << "p = " << p << endl;
    return 0;
}

コンストラクターでスローされた例外。クラスポインタはreinterpret_castを使用して、アドレス1のメモリをポイントします。例外はコンストラクターでスローされるため、構築プロセスはすぐに停止し、現在のオブジェクトを生成できず、デストラクターは呼び出されず、オブジェクトが占有していたスペースはすぐに再利用されます

コンパイルして実行:

$ g++ 49-1.cpp -o 49-1
$ ./49-1
Test()
Exception
p = 0x1

pポインタアドレスがまだ1であることがわかります。これは、オブジェクトが生成されていないことも反映しています。

ここでは、オブジェクトによって占有されていたスペースがすぐに解放されることを証明します。valgrindを使用して、メモリリークを検出します。メモリが解放されれば、メモリリークはありません。削除がないため、解放されなければメモリリークが発生します。
ここに画像の説明を挿入
メモリリークがないことがわかります。

throw 0をコメントすると、10行目にメモリリークがありますので、チェックしてメモリリークが発生していることを確認しましょう。
ここに画像の説明を挿入

2破壊の異常

デストラクタの例外により、オブジェクトによって使用されているリソースが完全に解放されなくなります。したがって、デストラクタで例外をスローすることは避けてください。

3まとめ

1.コンストラクタとデストラクタで例外をスローしないでください

298件のオリジナル記事を公開 181 件を賞賛 100,000回以上の閲覧

おすすめ

転載: blog.csdn.net/happyjacob/article/details/104661313