diff options
author | Andrei Golubev <andrei.golubev@qt.io> | 2021-04-25 12:36:46 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-04-27 07:39:54 +0000 |
commit | 36e0a4a98fda02b4ab5e8686b1c56f173c2c2f48 (patch) | |
tree | ac6a108548eed6655ad8c0e20ff63684f7f8d948 /src/corelib | |
parent | 802388d0746296a244472f275ae5cc8598973f9f (diff) |
Do not shift the data pointer when removing all elements from QList
Because leaving the pointer untouched is a much more expected behavior
The tests for this (and not only) logic can be found in the following commit
Change-Id: Iec9eec9bbce04c9fd90cb6be9627c135cd989b7f
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit 38bba2a87c6c5c2b8100870add6d0d7ad559e669)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/tools/qarraydataops.h | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index 02609a369e..6e75b03a72 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -231,10 +231,12 @@ public: // are invalidated. However, erasing from the beginning effectively // means that all iterators are invalidated. We can use this freedom to // erase by moving towards the end. - if (b == this->begin()) + if (b == this->begin() && e != this->end()) { this->ptr = e; - else if (e != this->end()) - ::memmove(static_cast<void *>(b), static_cast<void *>(e), (static_cast<T *>(this->end()) - e) * sizeof(T)); + } else if (e != this->end()) { + ::memmove(static_cast<void *>(b), static_cast<void *>(e), + (static_cast<T *>(this->end()) - e) * sizeof(T)); + } this->size -= n; } @@ -610,7 +612,7 @@ public: // are invalidated. However, erasing from the beginning effectively // means that all iterators are invalidated. We can use this freedom to // erase by moving towards the end. - if (b == this->begin()) { + if (b == this->begin() && e != this->end()) { this->ptr = e; } else { const T *const end = this->end(); @@ -839,7 +841,7 @@ public: // erase by moving towards the end. std::destroy(b, e); - if (b == this->begin()) { + if (b == this->begin() && e != this->end()) { this->ptr = e; } else if (e != this->end()) { memmove(static_cast<void *>(b), static_cast<const void *>(e), (static_cast<const T *>(this->end()) - e)*sizeof(T)); |