我正在使用Qt 4.7.4(64位)开发一个gui proram。我试图将问题隔离如下:
我有一个窗口:class PreferencesWindow : public QMainWindow
,在另一个类中我初始化并将其显示为
QSharedPointer<PreferencesWindow> pPreferencesWindow = QSharedPointer<PreferencesWindow>(new PreferencesWindow());
pPreferencesWindow->show();
一切都很好,然后按ESC
或点击窗口上的x
按钮关闭窗口。然后我打电话给
QApplication::quit();
终止整个程序。它会终止但在终止之前会出现分段错误。
这里的问题是,当我使用常规指针代替QSharedPointer
时如何干净地终止,以及如何在这种情况下正确使用QSharedPointer
?
答案 0 :(得分:3)
我怀疑问题在于,当您关闭窗口时,pPreferencesWindow
指向的数据结构将被删除而不知道QSharedPointer
。当QSharedPointer
本身稍后被销毁时,它会双重删除窗口,然后你会得到段错误。
基本上,与所有共享指针实现一样,要么每个人都玩,要么没人做。由于Qt内部永远不会知道您使用智能指针来管理窗口,因此您无法使用它。然而,这是一种伪装的祝福;这意味着Qt本身拥有指针并同意为你管理它,所以你毕竟不需要智能指针!
答案 1 :(得分:1)
我不是Qt的专家,但我的第一个想法是QMainWindow
在销毁时删除它自己,QSharedPointer
对象也会在它被销毁时删除它(即对象是{{1两次)。如果是这样,您根本不需要使用delete
。
编辑:looks like QSharedPointer
QtWidget
标志会导致我所描述的行为。