Пользовательская система просмотра Symbian, ошибка сегментации в неизвестном месте, неизвестная причина - PullRequest
0 голосов
/ 13 мая 2011

Я занимаюсь разработкой приложения для Symbian. Я написал систему для легкого изменения представлений, примерно так:

class ViewManager : public QWidget {
   public slots:
      void changeView( const QString &id ) {
         if( currentView_m ) {
            delete currentView_m;
            currentView_m = 0;
         }

         if( id == "main" ) {
            currentView = new MainView( this );
         }
         else if( ... ) {
            //etc..

         layout_m->addWidget( currentView_m );
         connect( currentView_m, SIGNAL( changeView( QString ) ),
                  this, SLOT( changeView( QString ) ) );
      }
   private:
      View *currentView_m;
};

class View : public QWidget {
   signals:
      void ChangeView( const QString &id );
};

class MainView : public View {
   public slots:
      void onButtonClicked() {
         emit changeView( "someview" );
      } 
};

Тогда в качестве примера я использую ViewManager в основном:

int main( int argc, char *argv[] ) {
   QApp app...

   ViewManager man;
   man.changeView( "main" );

   app.exec();
}

Когда я меняю вид в первый раз, он работает просто отлично, затем, когда я изменяю вид в другой раз, он segfaults! Вы можете подумать, что это происходит с ошибками, когда я удаляю указатель currentView_m, но нет! Ошибка сегментации происходит сразу после выхода программы из слота changeView.

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

Может быть, после вызова слота программа переходит в цикл обработки событий QApplication и вылетает там? Я использую собственные виджеты внутри реализаций View, которые переопределяют некоторые из защищенных событий QWidget.

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Вы удаляете объект, сигнал которого вы обрабатываете.Вместо delete просто вызовите deleteLater() для объекта, отложив удаление до «безопасной» точки.

0 голосов
/ 13 мая 2011

Попробуйте сначала удалить вид из макета. Затем удалите представление. Для этого вы можете использовать методы извлечения RemoveWidget, removeItem

Возможно, Layout пытается получить доступ к представлению удаления.

Читать это Qt - удалить все виджеты из макета? вопрос также. Это может дать вам понимание.

...