gpt4 book ai didi

python - shared_ptr 崩溃

转载 作者:行者123 更新时间:2023-11-27 23:52:17 25 4
gpt4 key购买 nike

这个简单的代码在程序结束时崩溃(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() 返回之后才会被调用,此时(我推测但非常有信心)QCoreApplication 对象的析构函数可能访问的各种数据结构已经被拆除和处理,因此当它试图访问它们时会发生崩溃。 (例如,您传递给 QCoreApplication 构造函数的 argv 指针在 QCoreApplication 析构函数运行时可能不再有效)

However, I have no way to destroy the QCoreApplication unless I force the user to call some finalize() method.

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com