这个简单的代码在程序结束时崩溃(Qt 5.9.1,gcc 5.4.1):
$ mysql -e "FLUSH TABLES WITH READ LOCK; system ./do-something.sh; UNLOCK TABLES;"
我知道通常的方法是在堆栈上声明一个#include <QCoreApplication>
#include <memory>
std::shared_ptr<QCoreApplication> manager;
int main(int argc, char *argv[])
{
manager = std::make_shared<QCoreApplication>(argc, argv);
}
实例,并在QCoreApplication
的末尾销毁它,但我的用例如下:我正在包装一个库利用Qt和Boost.Python,我在python模块加载时初始化Qt。但是,除非我强制用户调用某个main()
方法,否则我无法销毁QCoreApplication
。
然后想法在库(python模块)被卸载时将其销毁,但这似乎不起作用。以上是预期的,如果是,为什么? &#34;销毁订单问题&#34;是我的第一个猜测,但在这种情况下,这应该被视为一个错误吗?
答案 0 :(得分:3)
问题(正如Lukas在上面的评论中所指出的)是共享指针是一个全局对象,这意味着在进程退出时,它的析构函数不会被调用,直到main()返回之后, QCoreApplication对象的析构函数可能访问的各种数据结构已经被拆除并处理掉了,因此当它试图访问它们时会崩溃,这一点(我猜测但非常有信心)。 (例如,传递给QCoreApplication构造函数的argv指针在运行QCoreApplication析构函数时可能不再有效)
但是,除非我强行,否则我无法销毁QCoreApplication 用户调用一些finalize()方法。
您可以尝试的一件事是使用atexit()注册一个删除QCoreApplication对象的回调函数。希望atexit()回调将在关闭序列中尽早调用,这样可以获得所需的行为。 (或者,如果所有其他方法都失败了,你可以让QCoreApplication对象泄漏;因为无论如何我都不会破坏这个过程,我认为这样做不会特别有害)