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

Static global structure's destructor not being called

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 被命中,但它没有。在 Does C++ call destructors for global and class static variables? 的已接受答案中,它表示如果可观察到的行为相同,即使没有调用析构函数,编译器也可以优化析构函数。但是我不明白我的例子是怎么回事。我什至通过在 GDB 中打印指令来验证析构函数没有被编译出来。如果我在析构函数中设置断点,GDB 会在程序结束时遇到内部错误!

PS:如果我运行只是在网上IDE上面的代码(当然,使其可编译),它工作得很好。我的环境有问题吗?

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

处失败

析构函数将始终在您的代码中被调用。

If I set a breakpoint in the destructor, GDB hits an internal error at the end of the program!

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

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

我是 运行 上述程序作为 Google 测试的一部分,该测试通过调用 _exit() 退出 main。当程序因调用 _exit() 而终止时,似乎不会调用静态全局对象的析构函数。参见 this answer and this