プロジェクトのクラスを作成しました。このInitializer
クラスは、コンストラクターで初期化を実行し、デストラクタで非初期化を実行します。私のプロジェクトのユーザーは、Initializer
プログラムの開始時に一度スタックにオブジェクトを作成し、スコープ外になったとき(プログラムの終了時など)に非初期化が行われるようにします。
Class Initialiser
{
Initialiser()
{
// Acquire resources
}
~Initialiser()
{
// Free resources
}
}
ユニットテストを作成して、初期化解除が正しく行われることを確認したいと思います。例:
bool verifyDeinitialization()
{
// Code to check that no resources are allocated
// Return true if none allocated, false otherwise
}
// Syntax below is for UnitTest++:
TEST(Initializer_Destructor_DeinitializationWorks)
{
{
Initializer init; // Will this be optimized away?
} // init goes out of scope, destructor called
CHECK(verifyDeinitialization())
}
私の質問は、デストラクタが取得したすべてのリソースを解放することによってコンストラクタの効果を完全に逆転させた場合、コンパイラは観察可能なものが何も起こらなかったことを検出し、init
オブジェクトを最適化するでしょうか?正しい非初期化は、最初から初期化が行われなかったのと同じであるため、単体テストで偽陰性が発生する可能性があるのではないかと心配しています(どちらの場合も、取得されたリソースはありません)。