析构函数单元测试会被优化掉吗?

Will a destructor unit test be optimised away?

本文关键字:优化 单元测试 析构函数      更新时间:2023-10-16

我已经为我的项目创建了一个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对象吗?我担心我的单元测试可能会提供假阴性(当它可能失败时通过测试),因为正确的取消初始化相当于从未进行初始化(在这两种情况下,都没有获得资源)。

是的,编译器允许这样做。是否一定会是一个无法令人信服地回答的问题,这是因为编译器优化没有得到标准的保证。

然而,如果初始化确实发生了,你可以简单地调整你的代码来设置一些标志&在verifyDeinitialization()函数中检查此标志,以检测是否实际发生了初始化并随后成功地取消了初始化,或者首先没有进行初始化。简而言之,您可以使用一个简单的标志来区分这两种场景。