QHash/QSet: fix squeeze() for default-constructed container
QHash::squeeze() was unconditionally calling reserve(0), which is always allocating memory (even for 0 size). This was leading to a confusing situation when calling squeeze() on a default-constructed container with 0 capacity() actually allocated memory. This is very misleading, as squeeze() is supposed to free unneeded memory, not to allocate more. This patch adds a check for non-zero capacity. As a result, nothing is done for default-constructed container. Note that this patch also affects the QSet::squeeze() behavior, because QSet uses QHash as its underlying data type. Task-number: QTBUG-91736 Change-Id: Ib1c3c8b7b3de6ddeefea0e70b1ec71803e8fd3b3 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Andreas Buhr <andreas.buhr@qt.io> (cherry picked from commit b095d268788343b67a3995db7148dcc3af9bde1a) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
d54f9df1bd
commit
448674a68d
@ -850,7 +850,11 @@ public:
|
|||||||
else
|
else
|
||||||
d = Data::detached(d, size_t(size));
|
d = Data::detached(d, size_t(size));
|
||||||
}
|
}
|
||||||
inline void squeeze() { reserve(0); }
|
inline void squeeze()
|
||||||
|
{
|
||||||
|
if (capacity())
|
||||||
|
reserve(0);
|
||||||
|
}
|
||||||
|
|
||||||
inline void detach() { if (!d || d->ref.isShared()) d = Data::detached(d); }
|
inline void detach() { if (!d || d->ref.isShared()) d = Data::detached(d); }
|
||||||
inline bool isDetached() const noexcept { return d && !d->ref.isShared(); }
|
inline bool isDetached() const noexcept { return d && !d->ref.isShared(); }
|
||||||
|
@ -2587,6 +2587,8 @@ void tst_QHash::fineTuningInEmptyHash()
|
|||||||
{
|
{
|
||||||
QHash<QString, int> hash;
|
QHash<QString, int> hash;
|
||||||
QCOMPARE(hash.capacity(), 0);
|
QCOMPARE(hash.capacity(), 0);
|
||||||
|
hash.squeeze();
|
||||||
|
QCOMPARE(hash.capacity(), 0);
|
||||||
QVERIFY(qFuzzyIsNull(hash.load_factor()));
|
QVERIFY(qFuzzyIsNull(hash.load_factor()));
|
||||||
QVERIFY(!hash.isDetached());
|
QVERIFY(!hash.isDetached());
|
||||||
|
|
||||||
|
@ -244,12 +244,12 @@ void tst_QSet::reserve()
|
|||||||
void tst_QSet::squeeze()
|
void tst_QSet::squeeze()
|
||||||
{
|
{
|
||||||
QSet<int> set;
|
QSet<int> set;
|
||||||
int n = set.capacity();
|
QCOMPARE(set.capacity(), 0);
|
||||||
QVERIFY(n == 0);
|
|
||||||
|
|
||||||
set.squeeze();
|
set.squeeze();
|
||||||
n = set.capacity();
|
QCOMPARE(set.capacity(), 0);
|
||||||
QVERIFY(n > 0 && n < 100);
|
|
||||||
|
QVERIFY(!set.isDetached());
|
||||||
|
|
||||||
set.reserve(1000);
|
set.reserve(1000);
|
||||||
QVERIFY(set.capacity() >= 1000);
|
QVERIFY(set.capacity() >= 1000);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user