Qt 应用程序在退出时崩溃

Posted

技术标签:

【中文标题】Qt 应用程序在退出时崩溃【英文标题】:Qt application crashing on exit 【发布时间】:2012-05-07 02:57:31 【问题描述】:

我有一个用 C++ 编写的带有 Qt 库的 GUI。对于我的应用程序,我使用了 TreeView 对象。为了使这个对象的重用变得容易,我制作了一个模板类,我的 QObjects 可以从中继承。由于 moc 不能与模板类一起使用,所以我制作了这样的类:

class Tree : public QObject, public TreeTemplate<TreeType, TreeItemType>

     Q_OBJECT
;

这样只允许 Tree 类使用 moc(TreeTemplate 不继承 QObject 或使用 Q_OBJECT 宏),同时获得模板的好处。

我的问题是,在退出我的应用程序时,我的应用程序崩溃,没有失败(即使我调用 exit 并跳过 QApplication 清理)。我认为生成的 moc 类可能存在问题,它们的“静态元对象”

我无法使用 valgrind,因为使用了无法处理的 __ASM__。 :-(

有谁知道我使用继承自模板类的模板 Qt 类 (+moc) 的设计是否会导致此问题?

崩溃发生在:libc.so 退出后。

【问题讨论】:

gdb 回溯显示什么? 添加一个空的虚拟析构函数会改变什么吗? 我在 Qt 中退出时的大部分崩溃都发生在我加倍释放类的实例时。大多数情况下,当我将一个类的“新”实例传递给一个拥有所有权的 Qt 容器(即容器将自动销毁它),然后尝试在我自己的代码中销毁它时,就会发生这种情况。 显而易见的建议是:不要从 TreeTemplate 派生,而是聚合它(添加为成员变量)。然后更改代码以使用聚合。我敢打赌,它仍然会崩溃。问题在于 TreeTemplate 代码中存在错误,或者您的程序中的其他地方存在错误。仅从 QObject 派生两个参数的模板类本身不会导致任何问题。您还没有提供可以复制它的 SSCCE。抱歉,目前无法为您提供更多帮助。 【参考方案1】:

AFAIK,你的方法行不通。

moc 在 C++ 预处理器之前运行,这就是为什么QObject 和模板类不起作用 - 预处理器尚未生成类。您正在对类进行模板化,因此moc 的关于该类的数据将与在预处理器期间从中创建的任何模板类的签名不匹配。

【讨论】:

那就不行了。你能告诉我们你代码的最后一行,在回溯中,它失败的地方吗?我很感激你不能使用 valgrind,但你的调试器至少会告诉你问题是从哪里开始的。 如果您的评论是真的“该类将与在预处理器期间从它创建的任何模板类的签名不匹配”我认为它不会编译,它会编译并运行.这就是我的意思。它在破坏之前表现得非常好。我稍后会得到堆栈跟踪。

以上是关于Qt 应用程序在退出时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用 QtWebEngine 退出时 QT 崩溃

QT 5.6.1 应用程序在退出插槽后仅在 x86 架构而不是 x64 上崩溃

Qt 调试崩溃/退出 python 并最终无法正确调试(例如,不在断点处停止)

qt的程序异常退出 求救

Qt中内存泄露和退出崩溃的问题 delete

添加库后qt应用程序在启动时崩溃