未调用静态全局结构的析构函数
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 test 在 EXPECT_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
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
析构函数将始终在您的代码中被调用。
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