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()函数中检查此标志以检测初始化是否实际发生并且随后是成功的取消初始化,或者首先没有初始化。简而言之,您可以使用一个简单的标志来区分这两种情况。

于 2013-03-05T04:08:37.607 回答