在QSharedPointer中使用窗口时出现分段错误的原因?

时间:2012-02-06 22:00:02

标签: c++ qt pointers segmentation-fault qsharedpointer

我正在使用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

2 个答案:

答案 0 :(得分:3)

我怀疑问题在于,当您关闭窗口时,pPreferencesWindow指向的数据结构将被删除而不知道QSharedPointer。当QSharedPointer本身稍后被销毁时,它会双重删除窗口,然后你会得到段错误。

基本上,与所有共享指针实现一样,要么每个人都玩,要么没人做。由于Qt内部永远不会知道您使用智能指针来管理窗口,因此您无法使用它。然而,这是一种伪装的祝福;这意味着Qt本身拥有指针并同意为你管理它,所以你毕竟不需要智能指针!

答案 1 :(得分:1)

我不是Qt的专家,但我的第一个想法是QMainWindow在销毁时删除它自己,QSharedPointer对象也会在它被销毁时删除它(即对象是{{1两次)。如果是这样,您根本不需要使用delete

编辑:looks like QSharedPointer QtWidget标志会导致我所描述的行为。