未调用静态全局结构的析构函数
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
会被命中,但它没有。在公认的答案"C++是否为全局和类静态变量调用析构函数?"中?,它说,如果可观察的行为相同,即使没有析构函数调用,编译器也可以优化析构函数。但我不明白我的例子是怎么回事。我甚至通过在GDB中打印指令来验证析构函数不是编译出来的。如果我在析构函数中设置了一个断点,GDB会在程序结束时遇到内部错误!
PS:如果我在在线IDE中只运行上面的代码(当然,使其可编译),它就可以正常工作。我的环境有问题吗?
EDIT:上面作为独立程序编译的示例运行良好。只是不在我的大项目中。所以我真的无法提供更多的代码来复制这个问题,因为它只发生在我的项目中。无论有没有unlink
,问题都是一样的。我真的在寻找在我的真实项目(环境等)中可能出错的想法,而不是让上面的代码作为一个独立的程序工作。这是一个在EXPECT_EQ
上失败的谷歌测试
作为Google测试的一部分,我运行了上述程序,该测试通过调用_exit()
退出main。当程序被调用_exit()
终止时,静态全局对象的析构函数似乎不会被调用。看到这个答案和这个
在代码中始终调用析构函数。
如果我在析构函数中设置了一个断点,GDB在末尾会遇到一个内部错误节目的!
尽量不要在全局对象的析构函数中调用unlink(someFile),因为主函数已经退出,并且此时可能尚未初始化某些相关库,因此unlink调用可能会导致一些意外行为。这应该是GDB遇到内部错误的原因。
你为什么说你的析构函数没有编译出来?请尝试通过用objdump和addr2line分解代码来验证它。
相关文章:
- 未调用的初始化静态thread_local结构的构造函数和析构函数
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- 为什么结构与auto_ptr和显式析构函数无法交换
- 程序结构以捕获SIGINT并在C++中调用析构函数
- 关于结构构造函数和析构函数行为-C++
- 未调用静态全局结构的析构函数
- 带有指针的C++结构:构造函数和析构函数
- 设计一个没有虚拟析构函数的多态类层次结构
- 为C++结构定义显式析构函数如何影响调用约定
- 结构sqlite3的sqlite3c++正向声明导致析构函数中删除时出现无效指针错误
- 树结构的C++析构函数
- 如果在派生类中定义了虚拟析构函数,但不是层次结构的顶部,该怎么办?C++
- 涉及类和结构的构造函数/析构函数
- 结构中的析构函数和c++中的类
- 在赋值运算符之前调用了结构的析构函数
- 结构对象析构函数
- 在公共层次结构中的类之间共享析构函数
- 结构体中指针数组的析构函数
- 继承层次结构:构造函数和析构函数执行顺序