From fa44b8aefde86057cb398997e8aa34fc0127791b Mon Sep 17 00:00:00 2001 From: Ye ShanShan Date: Wed, 20 Nov 2024 09:44:39 +0800 Subject: [PATCH] fix: memory leak Delay to create appLoaderItem, and it's lifecycle is managed by parentItem. DPalette of QQmlOpenMetaObjectType isn't release. Log: as title. pms: Task-368399 --- src/dquickwindow.cpp | 10 ++++++++-- src/private/dquickcontrolpalette.cpp | 6 ++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/dquickwindow.cpp b/src/dquickwindow.cpp index 2e48ecd89..441267459 100644 --- a/src/dquickwindow.cpp +++ b/src/dquickwindow.cpp @@ -64,7 +64,7 @@ DQuickWindowAttachedPrivate::DQuickWindowAttachedPrivate(QWindow *window, DQuick : DObjectPrivate(qq) , window(window) , wmWindowTypes(DWindowManagerHelper::UnknowWindowType) - , appLoaderItem(new DQuickAppLoaderItem()) + , appLoaderItem(nullptr) { } @@ -482,6 +482,10 @@ QQmlComponent *DQuickWindowAttached::loadingOverlay() const DQuickAppLoaderItem *DQuickWindowAttached::appLoader() const { D_DC(DQuickWindowAttached); + if (!d->appLoaderItem) { + const_cast(d)->appLoaderItem = + new DQuickAppLoaderItem(window()->contentItem()); + } return d->appLoaderItem; } @@ -494,7 +498,9 @@ void DQuickWindowAttached::setAppLoader(DQuickAppLoaderItem *item) // AppLoaderItem 会在窗口加载完毕后进行创建,因此 // 在窗口创建初期,AppLoaderItem 需要指定一个默认 // 值,防止 Qt 在运行时出现警告和报错 - d->appLoaderItem->deleteLater(); + if (d->appLoaderItem) { + d->appLoaderItem->deleteLater(); + } d->appLoaderItem = item; Q_EMIT appLoaderChanged(); } diff --git a/src/private/dquickcontrolpalette.cpp b/src/private/dquickcontrolpalette.cpp index 2777eaecd..d9b6c6284 100644 --- a/src/private/dquickcontrolpalette.cpp +++ b/src/private/dquickcontrolpalette.cpp @@ -191,9 +191,11 @@ class Q_DECL_HIDDEN CustomMetaObject : public QQmlOpenMetaObject } - ~CustomMetaObject() + ~CustomMetaObject() override { - + if (auto item = type()) { + item->release(); + } } inline DQuickControlColorSelector *owner() const {