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

标签 c++ unit-testing destructor compiler-optimization

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

关于c++ - 析构函数单元测试会被优化掉吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215587/

相关文章:

c++ - 删除 constexpr 会改变链接吗?

c++ - 在 C++ 程序中处理 "system"调用的结果

visual-studio-2010 - Visual Studio 负载测试以数据驱动的方式模拟许多用户?

VB.NET - 实现 IDisposable 时是否应该添加 Finalize 方法?

c++ - 调用静态成员函数时出错

c++ - 如何转换 RGB -> YUV -> RGB(双向)

c# - 单元测试顺序约定?

java - 如何模拟当前日期?

c++ - 静态析构函数

c++ - Constexpr CRTP析构函数