From 76eb198b9c450ce2f26b81febbeb6387dbfeb421 Mon Sep 17 00:00:00 2001 From: Ming Rui Zhang Date: Fri, 14 May 2021 15:04:12 -0400 Subject: [PATCH] mainapplication: use QScopedPointer and control the order of destruction Change-Id: I48b9019acdb505cdde3da183a1022dea8eacebc0 --- src/mainapplication.cpp | 31 +++++++++++++++++++++---------- src/mainapplication.h | 8 ++++---- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/mainapplication.cpp b/src/mainapplication.cpp index 7a7aebe6..4abceb69 100644 --- a/src/mainapplication.cpp +++ b/src/mainapplication.cpp @@ -161,11 +161,20 @@ MainApplication::MainApplication(int& argc, char** argv) , engine_(new QQmlApplicationEngine()) , connectivityMonitor_(new ConnectivityMonitor(this)) , settingsManager_(new AppSettingsManager(this)) - , systemTray_(new SystemTray(settingsManager_, this)) + , systemTray_(new SystemTray(settingsManager_.get(), this)) { QObject::connect(this, &QApplication::aboutToQuit, [this] { cleanup(); }); } +MainApplication::~MainApplication() +{ + engine_.reset(); + systemTray_.reset(); + settingsManager_.reset(); + lrcInstance_.reset(); + connectivityMonitor_.reset(); +} + bool MainApplication::init() { @@ -194,7 +203,7 @@ MainApplication::init() gnutls_global_init(); #endif - initLrc(results[opts::UPDATEURL].toString(), connectivityMonitor_); + initLrc(results[opts::UPDATEURL].toString(), connectivityMonitor_.get()); #ifdef Q_OS_UNIX GlobalInstances::setDBusErrorHandler(std::make_unique()); @@ -223,7 +232,7 @@ MainApplication::init() } #endif - connect(connectivityMonitor_, &ConnectivityMonitor::connectivityChanged, [this] { + connect(connectivityMonitor_.get(), &ConnectivityMonitor::connectivityChanged, [this] { lrcInstance_->connectivityChanged(); }); @@ -414,14 +423,16 @@ void MainApplication::initQmlLayer() { // setup the adapters (their lifetimes are that of MainApplication) - auto callAdapter = new CallAdapter(systemTray_, lrcInstance_.data(), this); - auto messagesAdapter = new MessagesAdapter(settingsManager_, lrcInstance_.data(), this); - auto conversationsAdapter = new ConversationsAdapter(systemTray_, lrcInstance_.data(), this); + auto callAdapter = new CallAdapter(systemTray_.get(), lrcInstance_.data(), this); + auto messagesAdapter = new MessagesAdapter(settingsManager_.get(), lrcInstance_.data(), this); + auto conversationsAdapter = new ConversationsAdapter(systemTray_.get(), + lrcInstance_.data(), + this); auto avAdapter = new AvAdapter(lrcInstance_.data(), this); auto contactAdapter = new ContactAdapter(lrcInstance_.data(), this); - auto accountAdapter = new AccountAdapter(settingsManager_, lrcInstance_.data(), this); - auto utilsAdapter = new UtilsAdapter(systemTray_, lrcInstance_.data(), this); - auto settingsAdapter = new SettingsAdapter(settingsManager_, lrcInstance_.data(), this); + auto accountAdapter = new AccountAdapter(settingsManager_.get(), lrcInstance_.data(), this); + auto utilsAdapter = new UtilsAdapter(systemTray_.get(), lrcInstance_.data(), this); + auto settingsAdapter = new SettingsAdapter(settingsManager_.get(), lrcInstance_.data(), this); auto pluginAdapter = new PluginAdapter(lrcInstance_.data(), this); // qml adapter registration @@ -473,7 +484,7 @@ MainApplication::initSystray() engine_->quit(); cleanup(); }); - connect(systemTray_, + connect(systemTray_.get(), &QSystemTrayIcon::activated, [this](QSystemTrayIcon::ActivationReason reason) { if (reason != QSystemTrayIcon::ActivationReason::Context) diff --git a/src/mainapplication.h b/src/mainapplication.h index 58c8a67f..f7b17832 100644 --- a/src/mainapplication.h +++ b/src/mainapplication.h @@ -71,7 +71,7 @@ class MainApplication : public QApplication public: explicit MainApplication(int& argc, char** argv); - ~MainApplication() = default; + ~MainApplication(); bool init(); void restoreApp(); @@ -94,9 +94,9 @@ private: QScopedPointer lrcInstance_; - ConnectivityMonitor* connectivityMonitor_; - AppSettingsManager* settingsManager_; - SystemTray* systemTray_; + QScopedPointer connectivityMonitor_; + QScopedPointer settingsManager_; + QScopedPointer systemTray_; ScreenInfo screenInfo_;