diff options
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qlist.cpp | 6 | ||||
-rw-r--r-- | src/corelib/tools/qlist.h | 12 |
2 files changed, 13 insertions, 5 deletions
diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp index 72924ef84c..ad33010faf 100644 --- a/src/corelib/tools/qlist.cpp +++ b/src/corelib/tools/qlist.cpp @@ -154,6 +154,12 @@ void QListData::realloc(int alloc) d->begin = d->end = 0; } +void QListData::dispose(Data *d) +{ + Q_ASSERT(!d->ref.isShared()); + free(d); +} + // ensures that enough space is available to append n elements void **QListData::append(int n) { diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index ad94781b6f..49f0ec750f 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -76,6 +76,8 @@ struct Q_CORE_EXPORT QListData { Data *detach(int alloc); Data *detach_grow(int *i, int n); void realloc(int alloc); + inline void dispose() { dispose(d); } + static void dispose(Data *d); static const Data shared_null; Data *d; void **erase(void **xi); @@ -664,7 +666,7 @@ Q_OUTOFLINE_TEMPLATE typename QList<T>::Node *QList<T>::detach_helper_grow(int i node_copy(reinterpret_cast<Node *>(p.begin()), reinterpret_cast<Node *>(p.begin() + i), n); } QT_CATCH(...) { - free(d); + p.dispose(); d = x; QT_RETHROW; } @@ -674,7 +676,7 @@ Q_OUTOFLINE_TEMPLATE typename QList<T>::Node *QList<T>::detach_helper_grow(int i } QT_CATCH(...) { node_destruct(reinterpret_cast<Node *>(p.begin()), reinterpret_cast<Node *>(p.begin() + i)); - free(d); + p.dispose(); d = x; QT_RETHROW; } @@ -693,7 +695,7 @@ Q_OUTOFLINE_TEMPLATE void QList<T>::detach_helper(int alloc) QT_TRY { node_copy(reinterpret_cast<Node *>(p.begin()), reinterpret_cast<Node *>(p.end()), n); } QT_CATCH(...) { - free(d); + p.dispose(); d = x; QT_RETHROW; } @@ -718,7 +720,7 @@ Q_OUTOFLINE_TEMPLATE QList<T>::QList(const QList<T> &l) struct Cleanup { Cleanup(QListData::Data *d) : d_(d) {} - ~Cleanup() { if (d_) free(d_); } + ~Cleanup() { if (d_) QListData::dispose(d_); } QListData::Data *d_; } tryCatch(d); @@ -760,7 +762,7 @@ Q_OUTOFLINE_TEMPLATE void QList<T>::dealloc(QListData::Data *data) { node_destruct(reinterpret_cast<Node *>(data->array + data->begin), reinterpret_cast<Node *>(data->array + data->end)); - free(data); + QListData::dispose(data); } |