From ec65481b54b9381549bac29b1a2fe2bbfca3525c Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 3 Feb 2025 18:18:44 +0100 Subject: [PATCH] StringTable: Fix isQStringInUse() With the current implementation it always returns true, even when there is only one existing copy of a string inside m_strings set, without any reference. This is due to creating a copy of the QArrayDataPointer: 1 QArrayData::ref / qarraydata.h 2 QArrayDataPointer::ref / qarraydatapointer.h 438 3 QArrayDataPointer::QArrayDataPointer / qarraydatapointer.h 40 4 isQStringInUse So, the ref_ is always at least 2. Avoid creating a copy by taking a reference instead. Observed misbehavior: After switching session nothing is erased from the m_strings, it cumulates indefinitely instead. Task-number: QTCREATORBUG-18800 Change-Id: I17981d44f88307e736ec03380baa39a03f0719bf Reviewed-by: hjk Reviewed-by: Fabian Kosmale --- src/libs/utils/stringtable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/utils/stringtable.cpp b/src/libs/utils/stringtable.cpp index 73cad02588a..0dde8ed59f9 100644 --- a/src/libs/utils/stringtable.cpp +++ b/src/libs/utils/stringtable.cpp @@ -103,7 +103,7 @@ static int bytesSaved = 0; static inline bool isQStringInUse(const QString &string) { - QStringPrivate data_ptr = const_cast(string).data_ptr(); + QStringPrivate &data_ptr = const_cast(string).data_ptr(); if (DebugStringTable) { const int ref = data_ptr->d_ptr()->ref_; bytesSaved += (ref - 1) * string.size();