почему ошибка сегментации возникает при использовании окна в QSharedPointer? - PullRequest
2 голосов
/ 07 февраля 2012

Я разрабатываю графическую программу, используя Qt 4.7.4 (64 бит).Я попытался выделить проблему следующим образом:

У меня есть окно: class PreferencesWindow : public QMainWindow, и в другом классе я инициализирую и показываю его как

QSharedPointer<PreferencesWindow> pPreferencesWindow = QSharedPointer<PreferencesWindow>(new PreferencesWindow());
pPreferencesWindow->show();

все хорошо, тогда язакройте окно, нажав ESC или нажав кнопку x в окне.И тогда я звоню

QApplication::quit();

, чтобы завершить всю программу.Он завершается, но выдает ошибку сегментации непосредственно перед завершением.

Вопрос здесь в том, почему он завершается чисто, когда я использую обычный указатель вместо QSharedPointer и как правильно использовать QSharedPointer в этом случае

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Я подозреваю, что проблема в том, что при закрытии окна структура данных, на которую указывает pPreferencesWindow, удаляется без ведома QSharedPointer.Когда сам QSharedPointer впоследствии уничтожается, он дважды удаляет окно, и вы получаете segfault.

По сути, как и во всех реализациях с общими указателями, либо все играют, либо никто не делает.Поскольку внутреннее устройство Qt никогда не узнает, что вы используете умный указатель для управления окном, вы не можете его использовать.Однако это скрытое благословение;это означает, что сам Qt овладевает указателем и соглашается управлять им для вас, так что вам не нужен умный указатель в конце концов!

1 голос
/ 07 февраля 2012

Я не эксперт по Qt, но мои первые мысли были бы о том, что QMainWindow удаляет себя при уничтожении, а объект QSharedPointer также удаляет объект при его уничтожении (то есть объект дважды delete d). Если это правда, вам вообще не нужно использовать QSharedPointer.

РЕДАКТИРОВАТЬ: Это выглядит как флаг QtWidget Qt::WA_DeleteOnClose будет вызывать поведение, которое я описал.

...