From a9fc317fcdec90e7f3ff2e6bfa392d49b5244585 Mon Sep 17 00:00:00 2001 From: zhaoyingzhen Date: Wed, 9 Jul 2025 13:52:56 +0800 Subject: [PATCH] fix: avoid memory leak as title Log: as title Pms: BUG-318013 --- .../plugin_manager/modules_loader.cpp | 22 ++++++++++++++++--- .../plugin_manager/modules_loader.h | 1 + 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/global_util/plugin_manager/modules_loader.cpp b/src/global_util/plugin_manager/modules_loader.cpp index f886bb11..bb97f0a2 100644 --- a/src/global_util/plugin_manager/modules_loader.cpp +++ b/src/global_util/plugin_manager/modules_loader.cpp @@ -33,6 +33,12 @@ ModulesLoader::~ModulesLoader() { quit(); wait(); + + QMutexLocker locker(&m_mutex); + for (auto &loader : m_pluginLoaders) { + cleanupPluginLoader(loader); + } + m_pluginLoaders.clear(); } ModulesLoader& ModulesLoader::instance() @@ -78,7 +84,7 @@ void ModulesLoader::findModule(const QString& path) } qCInfo(DDE_SHELL) << "About to process " << module; - auto loader = new QPluginLoader(path); + auto loader = std::unique_ptr(new QPluginLoader(path)); // 检查兼容性 const QJsonObject meta = loader->metaData().value("MetaData").toObject(); @@ -134,7 +140,8 @@ void ModulesLoader::findModule(const QString& path) loader->moveToThread(qApp->thread()); QMutexLocker locker(&m_mutex); - m_pluginLoaders.insert(moduleInstance->key(), QPointer(loader)); + m_pluginLoaders.insert(moduleInstance->key(), QPointer(loader.get())); + loader.release(); // 释放所有权,防止 QPluginLoader 被析构 PluginManager::instance()->addPlugin(moduleInstance, version); } m_loadLoginModule = true; @@ -268,6 +275,7 @@ bool ModulesLoader::isPluginEnabled(const QFileInfo& module) auto dbusInterface = new QDBusInterface(service, targetPath, interface, dbusConnection); if (!dbusInterface || !dbusInterface->isValid()) { qCWarning(DDE_SHELL) << "Check plugin enabled dbus interface is not valid."; + dbusInterface->deleteLater(); return false; } const bool pluginEnabled = dbusInterface->property(property.toStdString().c_str()).toBool(); @@ -346,6 +354,14 @@ void ModulesLoader::unloadPlugin(const QString& path) } } +void ModulesLoader::cleanupPluginLoader(QPluginLoader* loader) +{ + if (loader) { + loader->unload(); + loader->deleteLater(); + } +} + // TODO 只重新加载/卸载变更的插件 void ModulesLoader::onDConfigPropertyChanged(const QString& key, const QVariant& value, QObject* objPtr) { @@ -367,4 +383,4 @@ void ModulesLoader::onDbusPropertiesChanged(const QString& interfaceName, const start(QThread::LowestPriority); } } -} \ No newline at end of file +} diff --git a/src/global_util/plugin_manager/modules_loader.h b/src/global_util/plugin_manager/modules_loader.h index eb25802a..504024fd 100644 --- a/src/global_util/plugin_manager/modules_loader.h +++ b/src/global_util/plugin_manager/modules_loader.h @@ -40,6 +40,7 @@ class ModulesLoader : public QThread bool isPluginEnabled(const QFileInfo &module); bool contains(const QString &pluginFile) const; QPair getPluginLoader(const QString &pluginFile) const; + void cleanupPluginLoader(QPluginLoader* loader); static void onDConfigPropertyChanged(const QString &key, const QVariant &value, QObject *objPtr);