From cd7aafef5033fc535b0f373d25f15ecc9de6903a Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 14 Jun 2018 14:46:28 +0200 Subject: [PATCH] Do not leak menus in watch model / debugger QMenu::addMenu does not take ownership, and QMenu::popup doesn't delete the menu either. Change-Id: Ia11170db6538c1019d06b3fd84bb79b1241b0b9d Reviewed-by: hjk --- src/plugins/debugger/watchhandler.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 4d8ac31ee85..17afe1b4071 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -416,9 +416,9 @@ public: QString removeNamespaces(QString str) const; bool contextMenuEvent(const ItemViewEvent &ev); - QMenu *createFormatMenu(WatchItem *item); - QMenu *createMemoryMenu(WatchItem *item); - QMenu *createBreakpointMenu(WatchItem *item); + QMenu *createFormatMenu(WatchItem *item, QWidget *parent); + QMenu *createMemoryMenu(WatchItem *item, QWidget *parent); + QMenu *createBreakpointMenu(WatchItem *item, QWidget *parent); void addStackLayoutMemoryView(bool separateView, const QPoint &p); @@ -1657,9 +1657,9 @@ bool WatchModel::contextMenuEvent(const ItemViewEvent &ev) [this] { grabWidget(); }); menu->addSeparator(); - menu->addMenu(createFormatMenu(item)); - menu->addMenu(createMemoryMenu(item)); - menu->addMenu(createBreakpointMenu(item)); + menu->addMenu(createFormatMenu(item, menu)); + menu->addMenu(createMemoryMenu(item, menu)); + menu->addMenu(createBreakpointMenu(item, menu)); menu->addSeparator(); addAction(menu, tr("Expand All Children"), @@ -1712,13 +1712,14 @@ bool WatchModel::contextMenuEvent(const ItemViewEvent &ev) menu->addSeparator(); menu->addAction(action(SettingsDialog)); + connect(menu, &QMenu::aboutToHide, menu, &QObject::deleteLater); menu->popup(ev.globalPos()); return true; } -QMenu *WatchModel::createBreakpointMenu(WatchItem *item) +QMenu *WatchModel::createBreakpointMenu(WatchItem *item, QWidget *parent) { - auto menu = new QMenu(tr("Add Data Breakpoint")); + auto menu = new QMenu(tr("Add Data Breakpoint"), parent); if (!item) { menu->setEnabled(false); return menu; @@ -1760,9 +1761,9 @@ QMenu *WatchModel::createBreakpointMenu(WatchItem *item) return menu; } -QMenu *WatchModel::createMemoryMenu(WatchItem *item) +QMenu *WatchModel::createMemoryMenu(WatchItem *item, QWidget *parent) { - auto menu = new QMenu(tr("Open Memory Editor")); + auto menu = new QMenu(tr("Open Memory Editor"), parent); if (!item || !m_engine->hasCapability(ShowMemoryCapability)) { menu->setEnabled(false); return menu; @@ -1813,9 +1814,9 @@ QMenu *WatchModel::createMemoryMenu(WatchItem *item) return menu; } -QMenu *WatchModel::createFormatMenu(WatchItem *item) +QMenu *WatchModel::createFormatMenu(WatchItem *item, QWidget *parent) { - auto menu = new QMenu(tr("Change Value Display Format")); + auto menu = new QMenu(tr("Change Value Display Format"), parent); if (!item) { menu->setEnabled(false); return menu;