From e5dde3e39118d5127c19a8de66ca29cff5968d31 Mon Sep 17 00:00:00 2001 From: Alf Henrik Sauge Date: Fri, 21 Aug 2026 14:25:51 +0200 Subject: [PATCH 1/5] Stack allocate LFS environment QDialog to avoid memory leaks --- src/dialogs/ConfigDialog.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dialogs/ConfigDialog.cpp b/src/dialogs/ConfigDialog.cpp index a1844c109..e565bec10 100644 --- a/src/dialogs/ConfigDialog.cpp +++ b/src/dialogs/ConfigDialog.cpp @@ -675,13 +675,13 @@ class LfsPanel : public QWidget { connect(environment, &QAbstractButton::clicked, this, [view] { git::Repository repo = view->repo(); - QDialog *dialog = new QDialog(); - dialog->setWindowTitle(tr("git-lfs env (read only)")); + QDialog dialog; + dialog.setWindowTitle(tr("git-lfs env (read only)")); QSize size(500, 500); - dialog->setFixedSize(size); + dialog.setFixedSize(size); - QTextEdit *textEdit = new QTextEdit(dialog); + QTextEdit *textEdit = new QTextEdit(&dialog); textEdit->setFixedSize(size); textEdit->setReadOnly(true); @@ -689,7 +689,7 @@ class LfsPanel : public QWidget { textEdit->append(string); } - dialog->exec(); + dialog.exec(); }); QPushButton *deinit = new QPushButton(tr("Deinitialize LFS")); From a246ecf7630d0f06c5ec76d99340ed846eddfc51 Mon Sep 17 00:00:00 2001 From: Alf Henrik Sauge Date: Fri, 21 Aug 2026 15:35:04 +0200 Subject: [PATCH 2/5] Fix memory leak in Repository::message --- src/git/Repository.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/git/Repository.cpp b/src/git/Repository.cpp index 601b5b1e8..10cca4813 100644 --- a/src/git/Repository.cpp +++ b/src/git/Repository.cpp @@ -183,7 +183,9 @@ Id Repository::workdirId(const QString &path) const { QString Repository::message() const { git_buf buf = GIT_BUF_INIT; git_repository_message(&buf, d->repo); - return QString::fromUtf8(buf.ptr, buf.size); + QString msg = QString::fromUtf8(buf.ptr, buf.size); + git_buf_dispose(&buf); + return msg; } // Config file used for git specific configs From 6bcc2f3a59ee466da345558adeeb9c1951efe689 Mon Sep 17 00:00:00 2001 From: Alf Henrik Sauge Date: Fri, 21 Aug 2026 15:35:59 +0200 Subject: [PATCH 3/5] Fix memory leak in RemotesPanel::addRemote --- src/dialogs/ConfigDialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dialogs/ConfigDialog.cpp b/src/dialogs/ConfigDialog.cpp index e565bec10..a4893b3f1 100644 --- a/src/dialogs/ConfigDialog.cpp +++ b/src/dialogs/ConfigDialog.cpp @@ -232,6 +232,7 @@ class RemotesPanel : public QWidget { connect(dialog, &QDialog::accepted, this, [this, dialog] { mRepo.addRemote(dialog->name(), dialog->url()); }); + dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->open(); } From 30d93e79b5ca85d4286fcb4b62b48f46292c8378 Mon Sep 17 00:00:00 2001 From: Alf Henrik Sauge Date: Fri, 21 Aug 2026 15:38:53 +0200 Subject: [PATCH 4/5] Fix memory leak in UpdateSubmodulesDialog --- src/dialogs/UpdateSubmodulesDialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dialogs/UpdateSubmodulesDialog.cpp b/src/dialogs/UpdateSubmodulesDialog.cpp index c155f9f92..262644f3a 100644 --- a/src/dialogs/UpdateSubmodulesDialog.cpp +++ b/src/dialogs/UpdateSubmodulesDialog.cpp @@ -93,6 +93,7 @@ class Model : public QAbstractTableModel { UpdateSubmodulesDialog::UpdateSubmodulesDialog(const git::Repository &repo, QWidget *parent) : QDialog(parent) { + setAttribute(Qt::WA_DeleteOnClose); mTable = new QTableView(this); mTable->setShowGrid(false); mTable->setSelectionMode(QAbstractItemView::NoSelection); From e4284256a0dfc4a4996e761e681b72ce65146c5a Mon Sep 17 00:00:00 2001 From: Alf Henrik Sauge Date: Fri, 21 Aug 2026 16:51:13 +0200 Subject: [PATCH 5/5] Fix spell checker object not being freed in TextEdit --- src/ui/CommitEditor.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ui/CommitEditor.cpp b/src/ui/CommitEditor.cpp index 00691ec11..8c2125bfe 100644 --- a/src/ui/CommitEditor.cpp +++ b/src/ui/CommitEditor.cpp @@ -50,9 +50,8 @@ class TextEdit : public QTextEdit { bool setupSpellCheck(const QString &dictPath, const QString &userDict, const QTextCharFormat &spellFormat, const QTextCharFormat &ignoredFormat) { - mSpellChecker = new SpellChecker(dictPath, userDict); + mSpellChecker = std::make_unique(dictPath, userDict); if (!mSpellChecker->isValid()) { - delete mSpellChecker; mSpellChecker = nullptr; mSpellList.clear(); setSelections(); @@ -248,7 +247,7 @@ class TextEdit : public QTextEdit { QTimer mTimer; - SpellChecker *mSpellChecker = nullptr; + std::unique_ptr mSpellChecker = nullptr; QTextCharFormat mSpellFormat; QTextCharFormat mIgnoredFormat; QList mSpellList;