From 5c87044870752ba9506d7f1d6a0b3de13e72c45f Mon Sep 17 00:00:00 2001 From: Jian Liang Date: Thu, 10 Oct 2013 14:28:22 +0800 Subject: [PATCH] Fix memory leak in QFileInfo::exists() Use the the legacy file engine object created in static function QFileInfo::exists() as the engine of the QFileInfo object to prevent memory leak. This can also boost a little performance. Change-Id: I06317d158d487be5ef15fe3244a917a371563ac9 Reviewed-by: hjk Reviewed-by: Olivier Goffart --- src/corelib/io/qfileinfo.cpp | 3 ++- src/corelib/io/qfileinfo_p.h | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp index 90122a9f0d..1c216f8a6b 100644 --- a/src/corelib/io/qfileinfo.cpp +++ b/src/corelib/io/qfileinfo.cpp @@ -691,7 +691,8 @@ bool QFileInfo::exists(const QString &file) QFileSystemEngine::resolveEntryAndCreateLegacyEngine(entry, data); // Expensive fallback to non-QFileSystemEngine implementation if (engine) - return QFileInfo(file).exists(); + return QFileInfo(new QFileInfoPrivate(entry, data, engine)).exists(); + QFileSystemEngine::fillMetaData(entry, data, QFileSystemMetaData::ExistsAttribute); return data.exists(); } diff --git a/src/corelib/io/qfileinfo_p.h b/src/corelib/io/qfileinfo_p.h index 442e6b5ef0..47359a55ce 100644 --- a/src/corelib/io/qfileinfo_p.h +++ b/src/corelib/io/qfileinfo_p.h @@ -120,6 +120,20 @@ public: metaData = QFileSystemMetaData(); } + inline QFileInfoPrivate(const QFileSystemEntry &file, const QFileSystemMetaData &data, QAbstractFileEngine *engine) + : fileEntry(file), + metaData(data), + fileEngine(engine), + cachedFlags(0), +#ifndef QT_NO_FSFILEENGINE + isDefaultConstructed(false), +#else + isDefaultConstructed(!fileEngine), +#endif + cache_enabled(true), fileFlags(0), fileSize(0) + { + } + inline void clearFlags() const { fileFlags = 0; cachedFlags = 0;