析构函数单元测试会被优化掉吗?
Will a destructor unit test be optimised away?
我已经为我的项目创建了一个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()
函数中检查此标志,以检测是否实际发生了初始化并随后成功地取消了初始化,或者首先没有进行初始化。简而言之,您可以使用一个简单的标志来区分这两种场景。
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 用于交叉编译和CMake的预处理器宏的单元测试
- C++ 用于单元测试的模板模板
- 提升 1.64 单元测试编译失败
- 单元测试欧拉到四元数实现失败
- 运行 C++ 单元测试时LNK2005链接错误
- 禁用自动捕获 Googletest 单元测试中的C++异常
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 使用 Google Test 对自定义断言函数进行单元测试
- 如何将我的 CMake 项目配置为运行所有单元测试?
- 在Qt C++单元测试中动态加载QQuickWindow而不是QQuickWidget
- MS 本机单元测试 - 断言::线程失败不起作用
- 如何获取 CMake 单元测试的相对路径?
- QTimer 超时不会在单元测试中触发
- 如何在提升构建中设置环境变量以进行提升单元测试框架?
- 在 AtMega32a 上运行的C++的单元测试
- visual studio是否有任何扩展来优化C++代码单元测试
- 析构函数单元测试会被优化掉吗?