From b6665f9cc0c70aef30b85d2f92fc7e6b738786e1 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Tue, 31 Jul 2018 21:11:31 -0700 Subject: [PATCH] UI: Use QScopedPointer (not QPointer) where applicable Contrary to what the name would have you believe, QPointer<> is not used to delete a pointer when it leaves its specific scope. Instead, it's used to check to see if the pointer is still valid. For most QWidget-based objects, this is actually fine because QWidgets that are assigned to layouts or other widgets will automatically be destroyed -- however, for non-widget objects, this can cause a memory leak. This patch replaces QPointer with QScopedPointer where applicable to prevent memory leaks. Closes obsproject/obs-studio#1367 --- UI/window-basic-filters.cpp | 4 ++-- UI/window-basic-main-transitions.cpp | 2 +- UI/window-basic-main.cpp | 28 ++++++++++++++-------------- UI/window-basic-main.hpp | 8 ++++---- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/UI/window-basic-filters.cpp b/UI/window-basic-filters.cpp index d792b1e1d..befa65c1b 100644 --- a/UI/window-basic-filters.cpp +++ b/UI/window-basic-filters.cpp @@ -569,7 +569,7 @@ static bool QueryRemove(QWidget *parent, obs_source_t *source) void OBSBasicFilters::on_addAsyncFilter_clicked() { - QPointer popup = CreateAddFilterPopupMenu(true); + QScopedPointer popup(CreateAddFilterPopupMenu(true)); if (popup) popup->exec(QCursor::pos()); } @@ -611,7 +611,7 @@ void OBSBasicFilters::on_asyncFilters_currentRowChanged(int row) void OBSBasicFilters::on_addEffectFilter_clicked() { - QPointer popup = CreateAddFilterPopupMenu(false); + QScopedPointer popup(CreateAddFilterPopupMenu(false)); if (popup) popup->exec(QCursor::pos()); } diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp index 7dc528a4a..952f5d4d2 100644 --- a/UI/window-basic-main-transitions.cpp +++ b/UI/window-basic-main-transitions.cpp @@ -750,7 +750,7 @@ void OBSBasic::CreateProgramOptions() programOptions->setLayout(layout); auto onAdd = [this] () { - QPointer menu = CreateTransitionMenu(this, nullptr); + QScopedPointer menu(CreateTransitionMenu(this, nullptr)); menu->exec(QCursor::pos()); }; diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 2a6881460..58bc754c8 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -233,7 +233,7 @@ OBSBasic::OBSBasic(QWidget *parent) cpuUsageInfo = os_cpu_usage_info_start(); cpuUsageTimer = new QTimer(this); - connect(cpuUsageTimer, SIGNAL(timeout()), + connect(cpuUsageTimer.data(), SIGNAL(timeout()), ui->statusbar, SLOT(UpdateCPUUsage())); cpuUsageTimer->start(3000); @@ -1694,7 +1694,7 @@ void OBSBasic::OnFirstLoad() this, &OBSBasic::ReceivedIntroJson); } if (wnit) { - introCheckThread = wnit; + introCheckThread.reset(wnit); introCheckThread->start(); } } @@ -2852,7 +2852,7 @@ void OBSBasic::CheckForUpdates(bool manualUpdate) if (updateCheckThread && updateCheckThread->isRunning()) return; - updateCheckThread = new AutoUpdateThread(manualUpdate); + updateCheckThread.reset(new AutoUpdateThread(manualUpdate)); updateCheckThread->start(); #endif @@ -4227,7 +4227,7 @@ void OBSBasic::AddSourcePopupMenu(const QPoint &pos) return; } - QPointer popup = CreateAddSourcePopupMenu(); + QScopedPointer popup(CreateAddSourcePopupMenu()); if (popup) popup->exec(pos); } @@ -4381,14 +4381,13 @@ void OBSBasic::UploadLog(const char *subdir, const char *file) if (logUploadThread) { logUploadThread->wait(); - delete logUploadThread; } RemoteTextThread *thread = new RemoteTextThread( "https://obsproject.com/logs/upload", "text/plain", ss.str().c_str()); - logUploadThread = thread; + logUploadThread.reset(thread); connect(thread, &RemoteTextThread::Result, this, &OBSBasic::logUploadFinished); logUploadThread->start(); @@ -6143,25 +6142,26 @@ void OBSBasic::ToggleShowHide() void OBSBasic::SystemTrayInit() { - trayIcon = new QSystemTrayIcon(QIcon(":/res/images/obs.png"), - this); + trayIcon.reset(new QSystemTrayIcon(QIcon(":/res/images/obs.png"), + this)); trayIcon->setToolTip("OBS Studio"); showHide = new QAction(QTStr("Basic.SystemTray.Show"), - trayIcon); + trayIcon.data()); sysTrayStream = new QAction(QTStr("Basic.Main.StartStreaming"), - trayIcon); + trayIcon.data()); sysTrayRecord = new QAction(QTStr("Basic.Main.StartRecording"), - trayIcon); + trayIcon.data()); sysTrayReplayBuffer = new QAction(QTStr("Basic.Main.StartReplayBuffer"), - trayIcon); + trayIcon.data()); exit = new QAction(QTStr("Exit"), - trayIcon); + trayIcon.data()); if (outputHandler && !outputHandler->replayBuffer) sysTrayReplayBuffer->setEnabled(false); - connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + connect(trayIcon.data(), + SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(IconActivated(QSystemTrayIcon::ActivationReason))); connect(showHide, SIGNAL(triggered()), diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index ced5227bf..29f33b587 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -138,9 +138,9 @@ private: const char *copyFiltersString; bool copyVisible = true; - QPointer updateCheckThread; - QPointer introCheckThread; - QPointer logUploadThread; + QScopedPointer updateCheckThread; + QScopedPointer introCheckThread; + QScopedPointer logUploadThread; QPointer interaction; QPointer properties; @@ -184,7 +184,7 @@ private: QPointer replayBufferButton; - QPointer trayIcon; + QScopedPointer trayIcon; QPointer sysTrayStream; QPointer sysTrayRecord; QPointer sysTrayReplayBuffer;