aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2020-02-18 12:44:24 +0100
committerFabian Kosmale <fabian.kosmale@qt.io>2020-02-19 15:27:44 +0100
commitd4f3445bb050bbc34f0e86832fca9b7047041c1e (patch)
treeb41aa20f7cd8d9f95628373172c5042979157906
parent2eb5b3f5c5f32404b8cb4ebb1d65ed5d5781b9f3 (diff)
Avoid memory leaks for inline component types
When a QQmlType is constructed from a QQmlTypePrivate, the latter's refcount is incremented. We decrement it again, as the QQmlType should be its sole owner. Change-Id: Id6ab618e06b49c10e3888c694113536caed7f058 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r--src/qml/qml/qqmlimport.cpp1
-rw-r--r--src/qml/qml/qqmltype.cpp5
2 files changed, 5 insertions, 1 deletions
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp
index 80eafdf146..3a06e98b6b 100644
--- a/src/qml/qml/qqmlimport.cpp
+++ b/src/qml/qml/qqmlimport.cpp
@@ -724,6 +724,7 @@ bool QQmlImportInstance::resolveType(QQmlTypeLoader *typeLoader, const QHashedSt
Q_ASSERT(ok);
typePriv->extraData.id->url = QUrl(this->url);
auto icType = QQmlType(typePriv);
+ typePriv->release();
return icType;
};
if (containingType.isValid()) {
diff --git a/src/qml/qml/qqmltype.cpp b/src/qml/qml/qqmltype.cpp
index 2b804c45a7..96a35b0fe9 100644
--- a/src/qml/qml/qqmltype.cpp
+++ b/src/qml/qml/qqmltype.cpp
@@ -946,7 +946,8 @@ int QQmlType::generatePlaceHolderICId() const
void QQmlType::associateInlineComponent(const QString &name, int objectID, const CompositeMetaTypeIds &metaTypeIds, QQmlType existingType)
{
- auto priv = existingType.isValid() ? const_cast<QQmlTypePrivate *>(existingType.d.data()) : new QQmlTypePrivate { RegistrationType::InlineComponentType } ;
+ bool const reuseExistingType = existingType.isValid();
+ auto priv = reuseExistingType ? const_cast<QQmlTypePrivate *>(existingType.d.data()) : new QQmlTypePrivate { RegistrationType::InlineComponentType } ;
priv->setName( QString::fromUtf8(typeName()), name);
auto icUrl = QUrl(sourceUrl());
icUrl.setFragment(QString::number(objectID));
@@ -958,6 +959,8 @@ void QQmlType::associateInlineComponent(const QString &name, int objectID, const
d->namesToInlineComponentObjectIndex.insert(name, objectID);
QQmlType icType(priv);
d->objectIdToICType.insert(objectID, icType);
+ if (!reuseExistingType)
+ priv->release();
}
void QQmlType::setPendingResolutionName(const QString &name)