Qt应用程序在退出时崩溃

3

我有一个使用Qt库编写的C++图形用户界面(GUI)。在我的应用程序中,我使用了一个TreeView对象。为了使该对象易于重用,我创建了一个模板类,可以让我的QObjects继承它。由于moc无法处理模板化的类,所以我将类设计成如下形式:

class Tree : public QObject, public TreeTemplate<TreeType, TreeItemType>
{
     Q_OBJECT
};

这样可以使只有Tree类使用moc(TreeTemplate不继承QObject或使用Q_OBJECT宏), 同时获得模板的好处。
我的问题是,当退出应用程序时,它总是崩溃(即时我调用exit并跳过QApplication清理)。我认为生成的moc类中存在“静态元对象”的问题。
由于使用了无法处理的__ASM__,所以我无法使用valgrind。 :-(
有没有人知道我的设计中使用继承自一个模板类的模板化Qt类(+moc)会导致这个问题?
崩溃在: libc.so之后。

2
gdb回溯(backtrace)显示了什么? - Frank Osterfeld
1
添加一个空的虚析构函数会改变什么吗? - Stefan Majewsky
3
在Qt中,我的大多数退出崩溃都发生在我重复释放某个类实例时。最常见的情况是当我将一个通过'new'创建的类实例传递给一个拥有所有权的Qt容器(即该容器会自动销毁它),然后在自己的代码中尝试销毁它时发生。 - jwernerny
明显的建议是:不要从TreeTemplate<A,B>派生,而是将其聚合(添加为成员变量)。然后更改代码以使用聚合。我敢打赌它仍然会崩溃。问题要么在于TreeTemplate代码本身有缺陷,要么在于程序中其他地方存在缺陷。仅仅从QObject *和一个两个参数的模板类派生本身并不会引起任何问题。您还没有提供能够重现该问题的SSCCE。很抱歉,此时无法再为您提供帮助。 - Kuba hasn't forgotten Monica
1个回答

1
据我所知,你的方法行不通。 moc 在 C++ 预处理器之前运行,这就是为什么 QObject 和模板类不起作用的原因 - 预处理器尚未生成这些类。你正在将类模板化,因此 moc 对于该类的数据与预处理器期间从其创建的任何模板类的签名不匹配。

然后它就无法工作了。您能展示一下您代码的最后一行吗?在回溯中,它是在哪里失败的?我感谢您不能使用valgrind,但是至少您的调试器可以告诉您问题从哪里开始。 - cmannett85
如果你的评论是真的,“类不会与预处理期间从它创建的任何模板类的签名匹配”,我认为它不会编译,但实际上它确实编译并运行。这就是我的意思。它在销毁之前表现得非常好。稍后我会把堆栈跟踪打印出来。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接