2

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

4

2 回答 2

3

我怀疑问题是当你关闭窗口时,指向的数据结构在' 不知情的pPreferencesWindow情况下被删除。QSharedPointer当它QSharedPointer本身后来被销毁时,它会双重删除窗口,你会得到段错误。

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

于 2012-02-06T22:07:03.303 回答
1

我不是 Qt 专家,但我的第一个想法是QMainWindow在销毁时删除自己,并且QSharedPointer对象在销毁时也会删除对象(即对象是deleted 两次)。如果这是真的,你根本不需要使用QSharedPointer

编辑:看起来QtWidget Qt::WA_DeleteOnClose标志会导致我描述的行为。

于 2012-02-06T22:06:38.520 回答