diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-09-06 09:36:01 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-09-06 14:00:41 +0200 |
commit | 4c5c75ee5a949b42472c3491614b8a88f321471b (patch) | |
tree | cda180b07c4e70100159eb6bf749c17f740b97e8 | |
parent | 6bddba36e03212a4a7d522938152519dfeec96c2 (diff) |
shiboken6: Fix some memory leaks shown by the address sanitizer
Change-Id: I31f3a2c6f3c124fa7ec566459cf255c29070e0ff
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
4 files changed, 36 insertions, 14 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp index 91da71cb9..6c4200395 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp @@ -75,6 +75,11 @@ public: { } + ~AbstractMetaClassPrivate() + { + qDeleteAll(m_templateArgs); + } + void addFunction(const AbstractMetaFunctionCPtr &function); void addConstructor(AbstractMetaFunction::FunctionType t, Access access, diff --git a/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp b/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp index de0f2eb4f..0b6c87ffc 100644 --- a/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp +++ b/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp @@ -144,6 +144,10 @@ public: { m_scopeStack.push(NamespaceModelItem(new _FileModelItem(m_model))); } + ~BuilderPrivate() + { + delete m_model; + } // Determine scope from top item. Note that the scope list does not necessarily // match the scope stack in case of forward-declared inner classes whose definition diff --git a/sources/shiboken6/ApiExtractor/modifications.h b/sources/shiboken6/ApiExtractor/modifications.h index 3335c8098..b97d7f292 100644 --- a/sources/shiboken6/ApiExtractor/modifications.h +++ b/sources/shiboken6/ApiExtractor/modifications.h @@ -107,18 +107,20 @@ struct ArgumentOwner int index = InvalidIndex; }; +using TemplateInstancePtr = QSharedPointer<TemplateInstance>; + class CodeSnipFragment { public: CodeSnipFragment() = default; explicit CodeSnipFragment(const QString &code) : m_code(code) {} - explicit CodeSnipFragment(TemplateInstance *instance) : m_instance(instance) {} + explicit CodeSnipFragment(const TemplateInstancePtr &instance) : m_instance(instance) {} QString code() const; private: QString m_code; - TemplateInstance *m_instance = nullptr; + QSharedPointer<TemplateInstance> m_instance; }; class CodeSnipAbstract : public CodeSnipHelpers @@ -129,7 +131,7 @@ public: void addCode(const QString &code); void addCode(QStringView code) { addCode(code.toString()); } - void addTemplateInstance(TemplateInstance *ti) + void addTemplateInstance(const TemplateInstancePtr &ti) { codeList.append(CodeSnipFragment(ti)); } diff --git a/sources/shiboken6/ApiExtractor/typesystemparser.cpp b/sources/shiboken6/ApiExtractor/typesystemparser.cpp index 7bcf24eab..8ad885089 100644 --- a/sources/shiboken6/ApiExtractor/typesystemparser.cpp +++ b/sources/shiboken6/ApiExtractor/typesystemparser.cpp @@ -907,28 +907,39 @@ bool TypeSystemParser::endElement(QStringView localName) if (m_current->parent->parent->type == StackElement::Root) { CodeSnipList snips = m_current->parent->entry->codeSnips(); CodeSnip snip = snips.takeLast(); - snip.addTemplateInstance(m_current->value.templateInstance); + TemplateInstancePtr ti(m_current->value.templateInstance); + snip.addTemplateInstance(ti); snips.append(snip); m_current->parent->entry->setCodeSnips(snips); break; } Q_FALLTHROUGH(); case StackElement::NativeToTarget: - case StackElement::AddConversion: - m_contextStack.top()->codeSnips.last().addTemplateInstance(m_current->value.templateInstance); + case StackElement::AddConversion: { + TemplateInstancePtr ti(m_current->value.templateInstance); + m_contextStack.top()->codeSnips.last().addTemplateInstance(ti); + } break; - case StackElement::Template: - m_current->parent->value.templateEntry->addTemplateInstance(m_current->value.templateInstance); + case StackElement::Template: { + TemplateInstancePtr ti(m_current->value.templateInstance); + m_current->parent->value.templateEntry->addTemplateInstance(ti); + } break; case StackElement::CustomMetaConstructor: - case StackElement::CustomMetaDestructor: - m_current->parent->value.customFunction->addTemplateInstance(m_current->value.templateInstance); + case StackElement::CustomMetaDestructor: { + TemplateInstancePtr ti(m_current->value.templateInstance); + m_current->parent->value.customFunction->addTemplateInstance(ti); + } break; - case StackElement::ConversionRule: - m_contextStack.top()->functionMods.last().argument_mods().last().conversionRules().last().addTemplateInstance(m_current->value.templateInstance); + case StackElement::ConversionRule: { + TemplateInstancePtr ti(m_current->value.templateInstance); + m_contextStack.top()->functionMods.last().argument_mods().last().conversionRules().last().addTemplateInstance(ti); + } break; - case StackElement::InjectCodeInFunction: - m_contextStack.top()->functionMods.last().snips().last().addTemplateInstance(m_current->value.templateInstance); + case StackElement::InjectCodeInFunction: { + TemplateInstancePtr ti(m_current->value.templateInstance); + m_contextStack.top()->functionMods.last().snips().last().addTemplateInstance(ti); + } break; default: break; // nada |