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.コンストラクタとデストラクタで例外をスローしないでください