include/vcl/glyphitem.hxx | 7 ++++--- vcl/source/gdi/impglyphitem.cxx | 37 +++++++++++++------------------------ 2 files changed, 17 insertions(+), 27 deletions(-)
New commits: commit adfd91d24678053b9a1475ad6985eb1fc548706a Author: Noel Grandin <[email protected]> AuthorDate: Mon May 10 20:17:11 2021 +0200 Commit: Noel Grandin <[email protected]> CommitDate: Tue May 11 11:14:05 2021 +0200 fix leak in SalLayoutGlyphs we forgot to delete the extra impls vector Also make more use of std::unique_ptr Change-Id: I2c745c0ad2b7ad62d368e9702bd2c32c734442fc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115375 Tested-by: Jenkins Reviewed-by: Noel Grandin <[email protected]> diff --git a/include/vcl/glyphitem.hxx b/include/vcl/glyphitem.hxx index d928bb954ee7..68f89701b2c3 100644 --- a/include/vcl/glyphitem.hxx +++ b/include/vcl/glyphitem.hxx @@ -24,6 +24,7 @@ #include <vcl/dllapi.h> #include <vector> +#include <memory> typedef sal_uInt16 sal_GlyphId; @@ -31,14 +32,14 @@ class SalLayoutGlyphsImpl; class VCL_DLLPUBLIC SalLayoutGlyphs final { - SalLayoutGlyphsImpl* m_pImpl = nullptr; + std::unique_ptr<SalLayoutGlyphsImpl> m_pImpl; // Extra items are in a dynamically allocated vector in order to save memory. // The usual case should be that this stays unused (it should be only used // when font fallback takes place). - std::vector<SalLayoutGlyphsImpl*>* m_pExtraImpls = nullptr; + std::unique_ptr<std::vector<std::unique_ptr<SalLayoutGlyphsImpl>>> m_pExtraImpls; public: - SalLayoutGlyphs() = default; + SalLayoutGlyphs(); SalLayoutGlyphs(const SalLayoutGlyphs&) = delete; SalLayoutGlyphs(SalLayoutGlyphs&&); ~SalLayoutGlyphs(); diff --git a/vcl/source/gdi/impglyphitem.cxx b/vcl/source/gdi/impglyphitem.cxx index 35681c341ea1..e9d5e699356c 100644 --- a/vcl/source/gdi/impglyphitem.cxx +++ b/vcl/source/gdi/impglyphitem.cxx @@ -23,13 +23,9 @@ #include <unx/freetype_glyphcache.hxx> #endif -SalLayoutGlyphs::~SalLayoutGlyphs() -{ - delete m_pImpl; - if (m_pExtraImpls) - for (SalLayoutGlyphsImpl* impl : *m_pExtraImpls) - delete impl; -} +SalLayoutGlyphs::SalLayoutGlyphs() {} + +SalLayoutGlyphs::~SalLayoutGlyphs() {} SalLayoutGlyphs::SalLayoutGlyphs(SalLayoutGlyphs&& rOther) { @@ -54,7 +50,7 @@ bool SalLayoutGlyphs::IsValid() const if (!m_pImpl->IsValid()) return false; if (m_pExtraImpls) - for (SalLayoutGlyphsImpl* impl : *m_pExtraImpls) + for (std::unique_ptr<SalLayoutGlyphsImpl> const& impl : *m_pExtraImpls) if (!impl->IsValid()) return false; return true; @@ -63,35 +59,28 @@ bool SalLayoutGlyphs::IsValid() const void SalLayoutGlyphs::Invalidate() { // Invalidating is in fact simply clearing. - delete m_pImpl; - m_pImpl = nullptr; - if (m_pExtraImpls) - { - for (SalLayoutGlyphsImpl* impl : *m_pExtraImpls) - delete impl; - delete m_pExtraImpls; - m_pExtraImpls = nullptr; - } + m_pImpl.reset(); + m_pExtraImpls.reset(); } SalLayoutGlyphsImpl* SalLayoutGlyphs::Impl(unsigned int nLevel) const { if (nLevel == 0) - return m_pImpl; + return m_pImpl.get(); if (m_pExtraImpls != nullptr && nLevel - 1 < m_pExtraImpls->size()) - return (*m_pExtraImpls)[nLevel - 1]; + return (*m_pExtraImpls)[nLevel - 1].get(); return nullptr; } void SalLayoutGlyphs::AppendImpl(SalLayoutGlyphsImpl* pImpl) { - if (m_pImpl == nullptr) - m_pImpl = pImpl; + if (!m_pImpl) + m_pImpl.reset(pImpl); else { - if (m_pExtraImpls == nullptr) - m_pExtraImpls = new std::vector<SalLayoutGlyphsImpl*>; - m_pExtraImpls->push_back(pImpl); + if (!m_pExtraImpls) + m_pExtraImpls.reset(new std::vector<std::unique_ptr<SalLayoutGlyphsImpl>>); + m_pExtraImpls->emplace_back(pImpl); } } _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
