diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index aca75e96567e4c17eeb27ded08811bfeb6a4adbc..e308e94768a1b8567dcb07d565398d7a0022d8e8 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -3374,8 +3374,8 @@ void UAS::addLink(LinkInterface* link) void UAS::removeLink(QObject* object) { - // Be careful of the fact that by the time this signal makes it through the queue - // the link object has already been destructed. So no dynamic_cast for example. + // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already + // been destroyed. LinkInterface* link = (LinkInterface*)object; diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index e5f87c531107640231003be92bae2c08757769fa..817b8ba8eb46bc3896bebc10688861fe9ff52dcd 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -1410,6 +1410,9 @@ void MainWindow::simulateLink(bool simulate) { void MainWindow::commsWidgetDestroyed(QObject *obj) { + // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already + // been destroyed. + if (commsWidgetList.contains(obj)) { commsWidgetList.removeOne(obj); diff --git a/src/ui/QGCUASFileViewMulti.cc b/src/ui/QGCUASFileViewMulti.cc index fb627ea044a2af5163ff34746f906ca73863fc9a..e2751625dc954e094f461f561e53d0272745ad25 100644 --- a/src/ui/QGCUASFileViewMulti.cc +++ b/src/ui/QGCUASFileViewMulti.cc @@ -10,45 +10,44 @@ QGCUASFileViewMulti::QGCUASFileViewMulti(QWidget *parent) : { ui->setupUi(this); setMinimumSize(600, 80); - connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(systemCreated(UASInterface*))); - connect(UASManager::instance(), SIGNAL(activeUASSet(int)), this, SLOT(systemSetActive(int))); + connect(UASManager::instance(), &UASManager::UASCreated, this, &QGCUASFileViewMulti::systemCreated); + connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), this, SLOT(systemSetActive(UASInterface*))); if (UASManager::instance()->getActiveUAS()) { systemCreated(UASManager::instance()->getActiveUAS()); - systemSetActive(UASManager::instance()->getActiveUAS()->getUASID()); + systemSetActive(UASManager::instance()->getActiveUAS()); } } void QGCUASFileViewMulti::systemDeleted(QObject* uas) { - UASInterface* mav = dynamic_cast(uas); - if (mav) + Q_ASSERT(uas); + + // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already + // been destroyed. + + UASInterface* mav = static_cast(uas); + QGCUASFileView* list = lists.value(mav, NULL); + if (list) { - int id = mav->getUASID(); - QGCUASFileView* list = lists.value(id, NULL); - if (list) - { - delete list; - lists.remove(id); - } + delete list; + lists.remove(mav); } } void QGCUASFileViewMulti::systemCreated(UASInterface* uas) { - if (!uas) { - return; - } + Q_ASSERT(uas); QGCUASFileView* list = new QGCUASFileView(ui->stackedWidget, uas->getFileManager()); - lists.insert(uas->getUASID(), list); + lists.insert(uas, list); ui->stackedWidget->addWidget(list); // Ensure widget is deleted when system is deleted connect(uas, SIGNAL(destroyed(QObject*)), this, SLOT(systemDeleted(QObject*))); } -void QGCUASFileViewMulti::systemSetActive(int uas) +void QGCUASFileViewMulti::systemSetActive(UASInterface* uas) { QGCUASFileView* list = lists.value(uas, NULL); if (list) { diff --git a/src/ui/QGCUASFileViewMulti.h b/src/ui/QGCUASFileViewMulti.h index 6b77613ecbeb227fe73801393558b1712fe6f32f..f9ed4f7b04ec494b708da833557da9ac180aa410 100644 --- a/src/ui/QGCUASFileViewMulti.h +++ b/src/ui/QGCUASFileViewMulti.h @@ -23,11 +23,11 @@ public: public slots: void systemDeleted(QObject* uas); void systemCreated(UASInterface* uas); - void systemSetActive(int uas); + void systemSetActive(UASInterface* uas); protected: void changeEvent(QEvent *e); - QMap lists; + QMap lists; private: Ui::QGCUASFileViewMulti *ui; diff --git a/src/ui/QGCWaypointListMulti.cc b/src/ui/QGCWaypointListMulti.cc index 752e8cdd4cfe870b1e5384bfb2cde17b14e903d6..ce34b7188221750ca10de52c9ed5d139b053a9d0 100644 --- a/src/ui/QGCWaypointListMulti.cc +++ b/src/ui/QGCWaypointListMulti.cc @@ -25,7 +25,10 @@ QGCWaypointListMulti::QGCWaypointListMulti(QWidget *parent) : void QGCWaypointListMulti::systemDeleted(QObject* uas) { - UASInterface* mav = dynamic_cast(uas); + // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already + // been destroyed. + + UASInterface* mav = static_cast(uas); if (mav) { int id = mav->getUASID(); diff --git a/src/ui/WaypointEditableView.cc b/src/ui/WaypointEditableView.cc index 0813598e00e13940ac9bfd5c8d3c507687657a07..45955cd16ca2cbfb8931bf0fde4af6f2d40f29e7 100644 --- a/src/ui/WaypointEditableView.cc +++ b/src/ui/WaypointEditableView.cc @@ -302,6 +302,9 @@ void WaypointEditableView::initializeActionView(int actionID) void WaypointEditableView::deleted(QObject* waypoint) { + // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already + // been destroyed. + Q_UNUSED(waypoint); } diff --git a/src/ui/designer/QGCToolWidget.cc b/src/ui/designer/QGCToolWidget.cc index 57cb635a1a5bd2240d91c8c7f8c738f580a9f978..37a3226a9c581c6f97b63d51c917dede6f300580 100644 --- a/src/ui/designer/QGCToolWidget.cc +++ b/src/ui/designer/QGCToolWidget.cc @@ -561,8 +561,9 @@ void QGCToolWidget::addToolWidget(QGCToolWidgetItem* widget) void QGCToolWidget::widgetRemoved() { - //Must static cast and not dynamic cast since the object is in the destructor - //and we only want to use it as a pointer value + // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already + // been destroyed. + QGCToolWidgetItem *widget = static_cast(QObject::sender()); toolItemList.removeAll(widget); storeWidgetsToSettings(); diff --git a/src/ui/menuactionhelper.cpp b/src/ui/menuactionhelper.cpp index 459ebaade3b6604c54b8ad7aff3d0ac89f44f867..ee75a8944a9136658135a3bf39fc703e520f1bd8 100644 --- a/src/ui/menuactionhelper.cpp +++ b/src/ui/menuactionhelper.cpp @@ -25,7 +25,10 @@ QAction *MenuActionHelper::createToolAction(const QString &title, const QString void MenuActionHelper::removeDockWidget() { - QObject *dockWidget = QObject::sender(); //Note that we can't cast to QDockWidget because we are in its destructor + // Do not dynamic cast or de-reference QObject, since object is either in destructor or may have already + // been destroyed. + + QObject *dockWidget = QObject::sender(); Q_ASSERT(dockWidget); qDebug() << "Dockwidget:" << dockWidget->objectName() << "of type" << dockWidget->metaObject()->className();