From 17f4adfe1840f507ada69fa6f25238c4c72064c3 Mon Sep 17 00:00:00 2001 From: Ivan Komissarov Date: Fri, 29 Jun 2018 16:31:31 +0300 Subject: Use std::unique_ptr for memory management in QMimeDataBasePrivate This change simplifies memory management as long as it doesn't requires manuall calls to qDeleteAll and manual deleting/nulling pointers. Change-Id: Id0dc563d0b1e74ae33939d90d4b39999020cd7ce Reviewed-by: Giuseppe D'Angelo --- src/corelib/mimetypes/qmimedatabase.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'src/corelib/mimetypes/qmimedatabase.cpp') diff --git a/src/corelib/mimetypes/qmimedatabase.cpp b/src/corelib/mimetypes/qmimedatabase.cpp index 9407b9ced8..a2e99f3816 100644 --- a/src/corelib/mimetypes/qmimedatabase.cpp +++ b/src/corelib/mimetypes/qmimedatabase.cpp @@ -76,7 +76,6 @@ QMimeDatabasePrivate::QMimeDatabasePrivate() QMimeDatabasePrivate::~QMimeDatabasePrivate() { - qDeleteAll(m_providers); } #ifdef QT_BUILD_INTERNAL @@ -116,37 +115,37 @@ void QMimeDatabasePrivate::loadProviders() const QString cacheFile = mimeDir + QStringLiteral("/mime.cache"); QFileInfo fileInfo(cacheFile); // Check if we already have a provider for this dir - const auto it = std::find_if(currentProviders.begin(), currentProviders.end(), [mimeDir](QMimeProviderBase *prov) { return prov->directory() == mimeDir; }); + const auto predicate = [mimeDir](const std::unique_ptr &prov) + { + return prov && prov->directory() == mimeDir; + }; + const auto it = std::find_if(currentProviders.begin(), currentProviders.end(), predicate); if (it == currentProviders.end()) { - QMimeProviderBase *provider = nullptr; + std::unique_ptr provider; #if defined(QT_USE_MMAP) if (qEnvironmentVariableIsEmpty("QT_NO_MIME_CACHE") && fileInfo.exists()) { - provider = new QMimeBinaryProvider(this, mimeDir); + provider.reset(new QMimeBinaryProvider(this, mimeDir)); //qDebug() << "Created binary provider for" << mimeDir; if (!provider->isValid()) { - delete provider; - provider = nullptr; + provider.reset(); } } #endif if (!provider) { - provider = new QMimeXMLProvider(this, mimeDir); + provider.reset(new QMimeXMLProvider(this, mimeDir)); //qDebug() << "Created XML provider for" << mimeDir; } - m_providers.push_back(provider); + m_providers.push_back(std::move(provider)); } else { - QMimeProviderBase *provider = *it; - currentProviders.erase(it); + auto provider = std::move(*it); // take provider out of the vector provider->ensureLoaded(); if (!provider->isValid()) { - delete provider; - provider = new QMimeXMLProvider(this, mimeDir); + provider.reset(new QMimeXMLProvider(this, mimeDir)); //qDebug() << "Created XML provider to replace binary provider for" << mimeDir; } - m_providers.push_back(provider); + m_providers.push_back(std::move(provider)); } } - qDeleteAll(currentProviders); } const QMimeDatabasePrivate::Providers &QMimeDatabasePrivate::providers() -- cgit v1.2.3