From e09025c1b6d43342e3086b7179109a08f39afd10 Mon Sep 17 00:00:00 2001 From: jian liang Date: Sun, 22 Jan 2012 22:38:49 +0800 Subject: fix memory leak of QLibraryPrivate this commit is aimed to fix QTBUG-4341. now QFactoryLoaderPrivate's destructor will call unload() to QLibaryPrivate object which will destory the plugin's root instance if its refcount reach zero. Task-number: QTBUG-4341 Change-Id: I3cd3e071b34271bf5802ab09f6c125beda5e9844 Reviewed-by: Robin Burchell Reviewed-by: David Faure Reviewed-by: Olivier Goffart --- src/corelib/plugin/qfactoryloader.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'src/corelib/plugin') diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp index e887ae8bf9..fe5aea0e8a 100644 --- a/src/corelib/plugin/qfactoryloader.cpp +++ b/src/corelib/plugin/qfactoryloader.cpp @@ -78,8 +78,11 @@ public: QFactoryLoaderPrivate::~QFactoryLoaderPrivate() { - for (int i = 0; i < libraryList.count(); ++i) - libraryList.at(i)->release(); + for (int i = 0; i < libraryList.count(); ++i) { + QLibraryPrivate *library = libraryList.at(i); + library->unload(); + library->release(); + } } QFactoryLoader::QFactoryLoader(const char *iid, @@ -142,7 +145,10 @@ void QFactoryLoader::update() library->release(); continue; } - QObject *instance = library->instance(); + + if (!library->inst) + library->inst = library->instance(); + QObject *instance = library->inst.data(); if (!instance) { library->release(); // ignore plugins that have a valid signature but cannot be loaded. @@ -215,8 +221,11 @@ QObject *QFactoryLoader::instance(const QString &key) const QString lowered = d->cs ? key : key.toLower(); if (QLibraryPrivate* library = d->keyMap.value(lowered)) { if (library->instance || library->loadPlugin()) { - if (QObject *obj = library->instance()) { - if (obj && !obj->parent()) + if (!library->inst) + library->inst = library->instance(); + QObject *obj = library->inst.data(); + if (obj) { + if (!obj->parent()) obj->moveToThread(QCoreApplicationPrivate::mainThread()); return obj; } -- cgit v1.2.3