2

Qt 4.7.4(64ビット)を使用してGUIプログラムを開発しています。私は次のように問題を切り分けようとしました:

私はウィンドウを持っています: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オブジェクトも削除するということです(つまり、オブジェクトはdelete2回dです)。これが当てはまる場合は、を使用する必要はまったくありませんQSharedPointer

編集:フラグが私が説明した動作を引き起こすようですQtWidget Qt::WA_DeleteOnClose

于 2012-02-06T22:06:38.520 に答える