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

时间:2017-01-20 05:48:06

标签: c++ struct static destructor c++98

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 test失败的EXPECT_EQ

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

  

如果我在析构函数中设置断点,GDB会在最后遇到内部错误   该计划!

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

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