From d1ced31e867f7e2bbd56daf46c7bf3cc924c8546 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Fri, 21 Aug 2009 12:48:35 +0200 Subject: Fix memory leak When the variant is invalid the shared is not destroyed. We even can avoid the creation of the PrivateShared if we know the variant is invalid Reviewed-by: Thierry --- src/corelib/kernel/qvariant.cpp | 9 ++++++--- tests/auto/qvariant/tst_qvariant.cpp | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index a91fb75..9adfa57 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -174,10 +174,13 @@ static void construct(QVariant::Private *x, const void *copy) case QVariant::UserType: break; default: - x->is_shared = true; - x->data.shared = new QVariant::PrivateShared(QMetaType::construct(x->type, copy)); - if (!x->data.shared->ptr) + void *ptr = QMetaType::construct(x->type, copy); + if (!ptr) { x->type = QVariant::Invalid; + } else { + x->is_shared = true; + x->data.shared = new QVariant::PrivateShared(ptr); + } break; } x->is_null = !copy; diff --git a/tests/auto/qvariant/tst_qvariant.cpp b/tests/auto/qvariant/tst_qvariant.cpp index 1722ad3..5ed0dcd 100644 --- a/tests/auto/qvariant/tst_qvariant.cpp +++ b/tests/auto/qvariant/tst_qvariant.cpp @@ -2622,7 +2622,7 @@ void tst_QVariant::qvariant_cast_QObject_data() { QTest::addColumn("data"); QTest::addColumn("success"); - QTest::newRow("from QObject") << QVariant(QMetaType::QObjectStar, new QObject) << true; + QTest::newRow("from QObject") << QVariant(QMetaType::QObjectStar, new QObject(this)) << true; QTest::newRow("from String") << QVariant(QLatin1String("1, 2, 3")) << false; QTest::newRow("from int") << QVariant((int) 123) << false; } -- cgit v0.12