From 1c5e223532cd1f731fe114768419e502dddcf1f9 Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Fri, 17 Feb 2023 18:17:01 -0800 Subject: [PATCH 1/3] MemoryViewWidget: Fix memory leaks bp_item/row_item/item were never deleted, and the normal Qt ownership system wasn't applying to them because they were being cloned. --- .../DolphinQt/Debugger/MemoryViewWidget.cpp | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Source/Core/DolphinQt/Debugger/MemoryViewWidget.cpp b/Source/Core/DolphinQt/Debugger/MemoryViewWidget.cpp index 04c8313dcf92..6f057aed4f5c 100644 --- a/Source/Core/DolphinQt/Debugger/MemoryViewWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/MemoryViewWidget.cpp @@ -321,36 +321,36 @@ void MemoryViewWidget::CreateTable() // Create cells and add data that won't be changing. // Breakpoint buttons - auto* bp_item = new QTableWidgetItem; - bp_item->setFlags(Qt::ItemIsEnabled); - bp_item->setData(USER_ROLE_IS_ROW_BREAKPOINT_CELL, true); - bp_item->setData(USER_ROLE_VALUE_TYPE, static_cast(Type::Null)); + auto bp_item = QTableWidgetItem(); + bp_item.setFlags(Qt::ItemIsEnabled); + bp_item.setData(USER_ROLE_IS_ROW_BREAKPOINT_CELL, true); + bp_item.setData(USER_ROLE_VALUE_TYPE, static_cast(Type::Null)); // Row Addresses - auto* row_item = new QTableWidgetItem(INVALID_MEMORY); - row_item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - row_item->setData(USER_ROLE_IS_ROW_BREAKPOINT_CELL, false); - row_item->setData(USER_ROLE_VALUE_TYPE, static_cast(Type::Null)); + auto row_item = QTableWidgetItem(INVALID_MEMORY); + row_item.setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + row_item.setData(USER_ROLE_IS_ROW_BREAKPOINT_CELL, false); + row_item.setData(USER_ROLE_VALUE_TYPE, static_cast(Type::Null)); // Data item - auto* item = new QTableWidgetItem(INVALID_MEMORY); - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable); - item->setData(USER_ROLE_IS_ROW_BREAKPOINT_CELL, false); + auto item = QTableWidgetItem(INVALID_MEMORY); + item.setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable); + item.setData(USER_ROLE_IS_ROW_BREAKPOINT_CELL, false); for (int i = 0; i < rows; i++) { - m_table->setItem(i, 0, bp_item->clone()); - m_table->setItem(i, 1, row_item->clone()); + m_table->setItem(i, 0, bp_item.clone()); + m_table->setItem(i, 1, row_item.clone()); for (int c = 0; c < m_data_columns; c++) { if (left_type && c < data_span) { - item->setData(USER_ROLE_VALUE_TYPE, static_cast(left_type.value())); + item.setData(USER_ROLE_VALUE_TYPE, static_cast(left_type.value())); } else { - item->setData(USER_ROLE_VALUE_TYPE, static_cast(m_type)); + item.setData(USER_ROLE_VALUE_TYPE, static_cast(m_type)); // Left type will never be these. auto text_alignment = Qt::AlignLeft; @@ -359,10 +359,10 @@ void MemoryViewWidget::CreateTable() { text_alignment = Qt::AlignRight; } - item->setTextAlignment(text_alignment | Qt::AlignVCenter); + item.setTextAlignment(text_alignment | Qt::AlignVCenter); } - m_table->setItem(i, c + MISC_COLUMNS, item->clone()); + m_table->setItem(i, c + MISC_COLUMNS, item.clone()); } } From b6d476241a24866f8f7b92e849450450485a5b2f Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Fri, 17 Feb 2023 18:20:50 -0800 Subject: [PATCH 2/3] CodeViewWidget: Fix memory leak Per https://doc.qt.io/qt-6/qabstractitemview.html#setItemDelegateForColumn setItemDelegateForColumn does not take ownership of the parameter, so it was not being deleted. Specifying a parent to QObject (via QStyledItemDelegate's constructor) will allow it to automatically be deleted, per https://doc.qt.io/qt-6/objecttrees.html. The other instance of a QItemDelegate in IOWindow.cpp already used this. --- Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp index e843420b1ecf..15c76289b4a9 100644 --- a/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp @@ -51,7 +51,7 @@ constexpr u32 WIDTH_PER_BRANCH_ARROW = 16; class BranchDisplayDelegate : public QStyledItemDelegate { public: - BranchDisplayDelegate(CodeViewWidget* parent) : m_parent(parent) {} + BranchDisplayDelegate(CodeViewWidget* parent) : QStyledItemDelegate(parent), m_parent(parent) {} private: CodeViewWidget* m_parent; From f1f3fd5d9d417447dfab69c531656cbe42eaf071 Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Fri, 17 Feb 2023 18:26:23 -0800 Subject: [PATCH 3/3] InputCommon: Fix memory leak in ExpressionParser We allocate in MakeSuppressor via `return unique_ptr(std::make_unique<...>(...).release(), InvokingDeleter{}`, so it wasn't properly getting freed. --- Source/Core/InputCommon/ControlReference/ExpressionParser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp index 1f7807185666..65f9ceba4fa4 100644 --- a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp +++ b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp @@ -37,6 +37,7 @@ class HotkeySuppressions void operator()(T* func) { (*func)(); + delete func; } };