在静态对象破坏时崩溃

时间:2009-12-28 07:39:31

标签: c++ static destructor

我正在开发第三方c ++应用。它在退出时崩溃了。如果我查看堆栈,我得到的是__static_initialization_and_destruction_0函数和许多问题标记。项目很大,不幸的是它有很多静态对象。有没有办法找出哪一个崩溃?

3 个答案:

答案 0 :(得分:2)

虽然这可能不是您正在寻找的建议,但请避免使用静态对象。原因是没有办法保证施工和破坏的顺序。

我在这里猜测,但完全有可能一个静态对象依赖于另一个静态对象。由于没有办法保证破坏的顺序,你最终会遇到麻烦。

将静态对象更改为在main函数开头创建的指针并在main函数结束时销毁可能是值得的。然后您可以选择适当地订购它们。

答案 1 :(得分:1)

如果可以的话,运行附带的调试器,它会让你在崩溃时突破。

否则,您可以尝试在析构函数中添加日志记录信息,例如:

std::cout << "In ~SomeObject." << std::endl;

答案 2 :(得分:0)

无效调用堆栈可能表示堆栈已被其中一个析构函数破坏。我建议你在每个析构函数中放置一个断点,为其实例化静态对象,然后你可以确定哪个是最后执行的析构函数。

同样在每次中断时,您应该观察调用堆栈中是否有损坏的迹象。如果将断点放在每个析构函数的末尾,则可能会在之前看到损坏的堆栈它实际崩溃。

如果您有多种类型的对象,一旦您确信它已正确执行,您可以删除该类的断点。此外,您可以仅在仅静态实例化的类中放置断点。