未调用静态全局结构的析构函数

Static global structure's destructor not being called

本文关键字:析构函数 结构 全局 调用 静态      更新时间:2023-10-16
typedef struct Object {
// some variable declarations.
Object(): var_(var) {}
~Object();
private:
// Prevent the compiler from generating a default
// copy constructor and assignment operator
DISABLE_COPY_AND_ASSIGN( Object );
} Object;
Object::~Object() {
assert( !"Destructor called" );.
if ( 1 ) {
logDebug( MODULE_STR_ID, "hello" );
assert( isUnitTest );
unlink( someFile );
}
}
static Object obj;
// main() is in some other file.

我预计析构函数中的assert会被命中,但它没有。在公认的答案"C++是否为全局和类静态变量调用析构函数?"中?,它说,如果可观察的行为相同,即使没有析构函数调用,编译器也可以优化析构函数。但我不明白我的例子是怎么回事。我甚至通过在GDB中打印指令来验证析构函数不是编译出来的。如果我在析构函数中设置了一个断点,GDB会在程序结束时遇到内部错误!

PS:如果我在在线IDE中只运行上面的代码(当然,使其可编译),它就可以正常工作。我的环境有问题吗?

EDIT:上面作为独立程序编译的示例运行良好。只是不在我的大项目中。所以我真的无法提供更多的代码来复制这个问题,因为它只发生在我的项目中。无论有没有unlink,问题都是一样的。我真的在寻找在我的真实项目(环境等)中可能出错的想法,而不是让上面的代码作为一个独立的程序工作。这是一个在EXPECT_EQ上失败的谷歌测试

作为Google测试的一部分,我运行了上述程序,该测试通过调用_exit()退出main。当程序被调用_exit()终止时,静态全局对象的析构函数似乎不会被调用。看到这个答案和这个

在代码中始终调用析构函数。

如果我在析构函数中设置了一个断点,GDB在末尾会遇到一个内部错误节目的!

尽量不要在全局对象的析构函数中调用unlink(someFile),因为主函数已经退出,并且此时可能尚未初始化某些相关库,因此unlink调用可能会导致一些意外行为。这应该是GDB遇到内部错误的原因。

你为什么说你的析构函数没有编译出来?请尝试通过用objdump和addr2line分解代码来验证它。