From 033e5dc183fc3dc24b18d16722eee06b89e950d1 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sun, 24 May 2020 11:19:48 +0200 Subject: [PATCH] QTranslator: replace manual memory handling with std::unique_ptr The QTranslator owns its QResource and its sub-translators, so hold them in unique_ptr to show what's going on. Change-Id: I65dfa8c3b6dd774066a01de23ae6cff7449b363a Reviewed-by: Lars Knoll --- src/corelib/kernel/qtranslator.cpp | 32 +++++++++++++----------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp index cc6e89e0d76..a9db17c7494 100644 --- a/src/corelib/kernel/qtranslator.cpp +++ b/src/corelib/kernel/qtranslator.cpp @@ -70,6 +70,9 @@ #include "qobject_p.h" +#include +#include + QT_BEGIN_NAMESPACE enum Tag { Tag_End = 1, Tag_SourceText16, Tag_Translation, Tag_Context16, Tag_Obsolete1, @@ -300,10 +303,10 @@ public: qsizetype unmapLength; // The resource object in case we loaded the translations from a resource - QResource *resource; + std::unique_ptr resource; // used if the translator has dependencies - QList subTranslators; + std::vector> subTranslators; // Pointers and offsets into unmapPointer[unmapLength] array, or user // provided data array @@ -531,7 +534,7 @@ bool QTranslatorPrivate::do_load(const QString &realname, const QString &directo // If the translation is in a non-compressed resource file, the data is already in // memory, so no need to use QFile to copy it again. Q_ASSERT(!d->resource); - d->resource = new QResource(realname); + d->resource = std::make_unique(realname); if (resource->isValid() && resource->compressionAlgorithm() == QResource::NoCompression && resource->size() >= MagicLength && !memcmp(resource->data(), magic, MagicLength)) { @@ -542,7 +545,6 @@ bool QTranslatorPrivate::do_load(const QString &realname, const QString &directo #endif ok = true; } else { - delete resource; resource = nullptr; } } @@ -615,7 +617,6 @@ bool QTranslatorPrivate::do_load(const QString &realname, const QString &directo if (!d->resource) delete [] unmapPointer; - delete d->resource; d->resource = nullptr; d->unmapPointer = nullptr; d->unmapLength = 0; @@ -864,21 +865,18 @@ bool QTranslatorPrivate::do_load(const uchar *data, qsizetype len, const QString if (ok && !isValidNumerusRules(numerusRulesArray, numerusRulesLength)) ok = false; if (ok) { - const int dependenciesCount = dependencies.count(); - subTranslators.reserve(dependenciesCount); - for (int i = 0 ; i < dependenciesCount; ++i) { - QTranslator *translator = new QTranslator; - subTranslators.append(translator); - ok = translator->load(dependencies.at(i), directory); + subTranslators.reserve(std::size_t(dependencies.size())); + for (const QString &dependency : std::as_const(dependencies)) { + auto translator = std::make_unique(); + ok = translator->load(dependency, directory); if (!ok) break; + subTranslators.push_back(std::move(translator)); } // In case some dependencies fail to load, unload all the other ones too. - if (!ok) { - qDeleteAll(subTranslators); + if (!ok) subTranslators.clear(); - } } if (!ok) { @@ -1055,7 +1053,7 @@ QString QTranslatorPrivate::do_translate(const char *context, const char *source } searchDependencies: - for (QTranslator *translator : subTranslators) { + for (const auto &translator : subTranslators) { QString tn = translator->translate(context, sourceText, comment, n); if (!tn.isNull()) return tn; @@ -1083,7 +1081,6 @@ void QTranslatorPrivate::clear() delete [] unmapPointer; } - delete resource; resource = nullptr; unmapPointer = nullptr; unmapLength = 0; @@ -1096,7 +1093,6 @@ void QTranslatorPrivate::clear() offsetLength = 0; numerusRulesLength = 0; - qDeleteAll(subTranslators); subTranslators.clear(); language.clear(); @@ -1140,7 +1136,7 @@ bool QTranslator::isEmpty() const { Q_D(const QTranslator); return !d->messageArray && !d->offsetArray && !d->contextArray - && d->subTranslators.isEmpty(); + && d->subTranslators.empty(); } /*!