这个简单的代码在程序端(Qt 5.9.1,gcc 5.4.1)崩溃:

#include <QCoreApplication>
#include <memory>

std::shared_ptr<QCoreApplication> manager;
int main(int argc, char *argv[])
{
    manager = std::make_shared<QCoreApplication>(argc, argv);
}


我知道通常的方法是在堆栈上声明一个QCoreApplication实例,并在main()的末尾销毁它,但是我的用例如下:我正在包装一个使用Qt和Boost的库.Python,并在加载python模块时像上面一样初始化Qt。但是,除非强制用户调用某些QCoreApplication方法,否则我无法销毁finalize()

当时的想法是在卸载库(python模块)时销毁它,但这似乎不起作用。以上是预期的吗?如果是,为什么? “破坏顺序问题”是我的第一个猜测,但是在这种情况下,应该将其视为错误吗?

最佳答案

问题(正如Lukas在上面的评论中指出的那样)是共享指针是一个全局对象,这意味着在进程退出时,直到main()返回之后,在那时(I'我猜测(但非常有信心)QCoreApplication对象的析构函数可能访问的各种数据结构已经被拆除和处置,因此在尝试访问它们时会崩溃。 (例如,在QCoreApplication析构函数运行时,传递给QCoreApplication构造函数的argv指针可能不再有效)


  但是,除非我强制执行,否则我无法销毁QCoreApplication。
  用户调用一些finalize()方法。


您可以尝试做的一件事是向atexit()注册一个回调函数,该函数将删除QCoreApplication对象。希望在关闭序列中足够早地调用atexit()回调,以使您获得所需的行为。 (或者,如果其他所有方法都失败了,您可以让QCoreApplication对象泄漏;因为无论如何该过程都将被销毁,我认为这样做不会造成特别的危害)

关于python - shared_ptr <QCoreApplication>崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45393738/

10-11 16:00