From 3b7c2b2221e2981f39a7aa363d31ae01d0d72169 Mon Sep 17 00:00:00 2001 From: Adriaan de Groot Date: Tue, 13 Jul 2021 11:02:24 +0200 Subject: [PATCH] [summaryq] Remove memory leak Don't use a vector of pointers, it is too easy (like when calling clear()) to leak memory. --- src/modules/summaryq/Config.cpp | 10 +++++----- src/modules/summaryq/Config.h | 12 ++++++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/modules/summaryq/Config.cpp b/src/modules/summaryq/Config.cpp index 8314802a9..e356f0589 100644 --- a/src/modules/summaryq/Config.cpp +++ b/src/modules/summaryq/Config.cpp @@ -39,7 +39,7 @@ SummaryModel::data( const QModelIndex& index, int role ) const return QVariant(); } const auto item = m_summary.at( index.row() ); - return role == Qt::DisplayRole ? item->title : item->message; + return role == Qt::DisplayRole ? item.title : item.message; } int @@ -49,22 +49,22 @@ SummaryModel::rowCount( const QModelIndex& ) const } void -SummaryModel::setSummary( const Calamares::ViewStepList& steps ) +SummaryModel::setSummary( const Calamares::ViewStepList& steps, bool withWidgets ) { - m_summary.clear(); Q_EMIT beginResetModel(); + m_summary.clear(); for ( Calamares::ViewStep* step : steps ) { QString text = step->prettyStatus(); - QWidget* widget = step->createSummaryWidget(); + QWidget* widget = withWidgets ? step->createSummaryWidget() : nullptr; if ( text.isEmpty() && !widget ) { continue; } - m_summary << new StepSummary { step->prettyName(), text }; + m_summary << StepSummary { step->prettyName(), text, widget }; } Q_EMIT endResetModel(); } diff --git a/src/modules/summaryq/Config.h b/src/modules/summaryq/Config.h index 39732a9e5..acce67e18 100644 --- a/src/modules/summaryq/Config.h +++ b/src/modules/summaryq/Config.h @@ -18,10 +18,18 @@ class SummaryQmlViewStep; + +/** @brief Data for one step + * + * A step generally has a text description, but **may** have a + * QWidget. There is no ownership of the QWidget, that is assumed + * to be handed off to some owning parent-widget. + */ struct StepSummary { QString title; QString message; + QWidget* widget = nullptr; }; class SummaryModel : public QAbstractListModel @@ -32,13 +40,13 @@ public: int rowCount( const QModelIndex& = QModelIndex() ) const override; QVariant data( const QModelIndex& index, int role ) const override; - void setSummary( const Calamares::ViewStepList& steps ); + void setSummary( const Calamares::ViewStepList& steps, bool withWidgets = false ); protected: QHash< int, QByteArray > roleNames() const override; private: - QVector< StepSummary* > m_summary; + QVector< StepSummary > m_summary; }; class Config : public QObject, public QQmlParserStatus