diff options
author | Andrei Golubev <andrei.golubev@qt.io> | 2021-03-24 16:47:33 +0100 |
---|---|---|
committer | Andrei Golubev <andrei.golubev@qt.io> | 2021-04-27 14:12:34 +0200 |
commit | 1f2d0cd983d08f1b8d791cb3674b0965d5e89f1a (patch) | |
tree | 40dbbc2cf53bc154c3758a2fb60f492d8b20d41d /src/corelib/text/qbytearray.cpp | |
parent | 4b518d878aadb132256e8cea48fd6249667f59bb (diff) |
Resurrect data moves in QList
Use the data moves to readjust the free space in the QList,
which ultimately fixes the out-of-memory issues caused by
cases like:
forever {
list.prepend(list.back());
list.removeLast();
}
Task-number: QTBUG-91801
Task-number: QTBUG-91360
Task-number: QTBUG-93019
Change-Id: Iacff69cbf36b8b5b176bb2663df635ec972c875c
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit a0253f5f0249024580050e4ec22d50cb139ef8d9)
Diffstat (limited to 'src/corelib/text/qbytearray.cpp')
-rw-r--r-- | src/corelib/text/qbytearray.cpp | 19 |
1 files changed, 5 insertions, 14 deletions
diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 061324e47c..e44dead1d6 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -1971,8 +1971,7 @@ QByteArray &QByteArray::append(const QByteArray &ba) QByteArray& QByteArray::append(char ch) { - if (d->needsDetach() || !d->freeSpaceAtEnd()) - reallocGrowData(1); + d.detachAndGrow(QArrayData::GrowsAtEnd, 1, nullptr, nullptr); d->copyAppend(1, ch); d.data()[d.size] = '\0'; return *this; @@ -2012,12 +2011,8 @@ QByteArray &QByteArray::insert(qsizetype i, QByteArrayView data) // defer a call to free() so that it comes after we copied the data from // the old memory: DataPointer detached{}; // construction is free - if (d->needsDetach() || i + size - d->size > d.freeSpaceAtEnd()) { - detached = DataPointer::allocateGrow(d, i + size - d->size, Data::GrowsAtEnd); - Q_CHECK_PTR(detached.data()); - detached->copyAppend(d.constBegin(), d.constEnd()); - d.swap(detached); - } + d.detachAndGrow(Data::GrowsAtEnd, (i - d.size) + size, &str, &detached); + Q_CHECK_PTR(d.data()); d->copyAppend(i - d->size, ' '); d->copyAppend(str, str + size); d.data()[d.size] = '\0'; @@ -2094,12 +2089,8 @@ QByteArray &QByteArray::insert(qsizetype i, qsizetype count, char ch) if (i >= d->size) { // handle this specially, as QArrayDataOps::insert() doesn't handle out of bounds positions - if (d->needsDetach() || i + count - d->size > d.freeSpaceAtEnd()) { - DataPointer detached(DataPointer::allocateGrow(d, i + count - d->size, Data::GrowsAtEnd)); - Q_CHECK_PTR(detached.data()); - detached->copyAppend(d.constBegin(), d.constEnd()); - d.swap(detached); - } + d.detachAndGrow(Data::GrowsAtEnd, (i - d.size) + count, nullptr, nullptr); + Q_CHECK_PTR(d.data()); d->copyAppend(i - d->size, ' '); d->copyAppend(count, ch); d.data()[d.size] = '\0'; |