diff --git a/src/lib/definition.cpp b/src/lib/definition.cpp --- a/src/lib/definition.cpp +++ b/src/lib/definition.cpp @@ -542,7 +542,7 @@ case QXmlStreamReader::StartElement: if (reader.name() == QLatin1String("itemData")) { Format f; - auto formatData = FormatPrivate::get(f); + auto formatData = FormatPrivate::detachAndGet(f); formatData->definition = q; formatData->load(reader); formatData->id = RepositoryPrivate::get(repo)->nextFormatId(); diff --git a/src/lib/format.cpp b/src/lib/format.cpp --- a/src/lib/format.cpp +++ b/src/lib/format.cpp @@ -52,8 +52,9 @@ return static_cast(value); } -FormatPrivate* FormatPrivate::get(const Format &format) +FormatPrivate* FormatPrivate::detachAndGet(Format &format) { + format.d.detach(); return format.d.data(); } @@ -65,7 +66,13 @@ return TextStyleData(); } -Format::Format() : d(new FormatPrivate) +static QExplicitlySharedDataPointer &sharedDefaultPrivate() +{ + static QExplicitlySharedDataPointer def(new FormatPrivate); + return def; +} + +Format::Format() : d(sharedDefaultPrivate()) { } diff --git a/src/lib/format_p.h b/src/lib/format_p.h --- a/src/lib/format_p.h +++ b/src/lib/format_p.h @@ -37,7 +37,7 @@ { public: FormatPrivate() = default; - static FormatPrivate* get(const Format &format); + static FormatPrivate* detachAndGet(Format &format); TextStyleData styleOverride(const Theme &theme) const; void load(QXmlStreamReader &reader);