summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/corelib/tools/qlist.cpp6
-rw-r--r--src/corelib/tools/qlist.h12
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);
}