2

プロジェクトのクラスを作成しました。この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オブジェクトを最適化するでしょうか?正しい非初期化は、最初から初期化が行われなかったのと同じであるため、単体テストで偽陰性が発生する可能性があるのではないかと心配しています(どちらの場合も、取得されたリソースはありません)。

4

1 に答える 1

1

はい、コンパイラはそうすることができます。確実にそうなるかどうかは、納得のいく答えが得られないものですが、これは、コンパイラの最適化が標準で保証されていないためです。

ただし、初期化が実際に発生した場合はコードを微調整してフラグを設定し、関数でこのフラグをチェックして、verifyDeinitialization()初期化が実際に発生し、その後に初期化が成功したかどうか、または最初に初期化がなかったかどうかを検出できます。つまり、単純なフラグを使用して 2 つのシナリオを区別できます。

于 2013-03-05T04:08:37.607 に答える