我为我的项目创建了一个Initializer
类,它在构造函数中执行初始化,在析构函数中执行deinitialization。我的项目的用户在程序开始时在堆栈上创建一个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
对象?我担心我的单元测试可能会提供假阴性(当它可能是失败时通过测试),因为正确的取消初始化相当于初始化从未发生过(在这两种情况下,都存在)没有获得的资源)。
答案 0 :(得分:1)
是的,编译器 允许这样做 。它是否肯定会令人难以置信地回答,这是因为标准不能保证编译器优化。
但是,如果初始化确实发生,您可以简单地调整代码以设置一些标记。在verifyDeinitialization()
函数中检查此标志,以检测初始化是否实际发生,然后是成功取消初始化,或者首先没有初始化。简而言之,您可以使用简单的标志来区分这两种情况。