[Libreoffice-commits] core.git: compilerplugins/clang hwpfilter/source include/basegfx sw/source
Noel Grandin
noel.grandin at collabora.co.uk
Mon Jan 23 07:00:03 UTC 2017
compilerplugins/clang/useuniqueptr.cxx | 137 +++++++++++++++++++++++++++++++
hwpfilter/source/hwpreader.cxx | 3
hwpfilter/source/hwpreader.hxx | 4
include/basegfx/raster/bpixelraster.hxx | 5 -
include/basegfx/raster/bzpixelraster.hxx | 5 -
sw/source/filter/ww8/wrtw8sty.cxx | 3
sw/source/filter/ww8/wrtww8.cxx | 12 +-
sw/source/filter/ww8/wrtww8.hxx | 6 -
sw/source/filter/ww8/ww8scan.cxx | 14 +--
sw/source/filter/ww8/ww8scan.hxx | 9 +-
sw/source/filter/ww8/ww8toolbar.cxx | 6 -
sw/source/filter/ww8/ww8toolbar.hxx | 5 -
sw/source/ui/index/swuiidxmrk.cxx | 4
sw/source/uibase/inc/swuiidxmrk.hxx | 4
14 files changed, 173 insertions(+), 44 deletions(-)
New commits:
commit 98e4013c22c4ce63090a575e698cc2af82925e6b
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date: Wed Jan 11 14:19:47 2017 +0200
new loplugin useuniqueptr
Change-Id: Ic7a8b32887c968d86568e4cfad7ddd1f4da7c73f
Reviewed-on: https://gerrit.libreoffice.org/33339
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
Tested-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/compilerplugins/clang/useuniqueptr.cxx b/compilerplugins/clang/useuniqueptr.cxx
new file mode 100644
index 0000000..82d95e5
--- /dev/null
+++ b/compilerplugins/clang/useuniqueptr.cxx
@@ -0,0 +1,137 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <set>
+#include "plugin.hxx"
+
+/**
+ Find destructors that only contain a single call to delete of a field. In which
+ case that field should really be managed by unique_ptr.
+*/
+
+namespace {
+
+class UseUniquePtr:
+ public RecursiveASTVisitor<UseUniquePtr>, public loplugin::Plugin
+{
+public:
+ explicit UseUniquePtr(InstantiationData const & data): Plugin(data) {}
+
+ virtual void run() override
+ {
+ TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+ }
+
+ bool VisitCXXDestructorDecl(const CXXDestructorDecl* );
+};
+
+bool UseUniquePtr::VisitCXXDestructorDecl(const CXXDestructorDecl* destructorDecl)
+{
+ if (ignoreLocation(destructorDecl))
+ return true;
+ if (isInUnoIncludeFile(destructorDecl))
+ return true;
+
+/*
+ StringRef aFileName = compiler.getSourceManager().getFilename(compiler.getSourceManager().getSpellingLoc(destructorDecl->getLocStart()));
+ // weird stuff, passing pointers to internal members of struct
+ if (aFileName.startswith(SRCDIR "/include/jvmfwk/framework.hxx"))
+ return true;
+*/
+ if (destructorDecl->getBody() == nullptr)
+ return true;
+ const CompoundStmt* compoundStmt = dyn_cast< CompoundStmt >( destructorDecl->getBody() );
+ if (compoundStmt == nullptr) {
+ return true;
+ }
+ if (compoundStmt->size() != 1) {
+ return true;
+ }
+ const CXXDeleteExpr* deleteExpr = dyn_cast<CXXDeleteExpr>(compoundStmt->body_front());
+ if (deleteExpr == nullptr) {
+ return true;
+ }
+
+ const ImplicitCastExpr* pCastExpr = dyn_cast<ImplicitCastExpr>(deleteExpr->getArgument());
+ if (!pCastExpr)
+ return true;
+ const MemberExpr* pMemberExpr = dyn_cast<MemberExpr>(pCastExpr->getSubExpr());
+ if (!pMemberExpr)
+ return true;
+
+ // ignore union games
+ const FieldDecl* pFieldDecl = dyn_cast<FieldDecl>(pMemberExpr->getMemberDecl());
+ if (!pFieldDecl)
+ return true;
+ TagDecl const * td = dyn_cast<TagDecl>(pFieldDecl->getDeclContext());
+ if (td->isUnion())
+ return true;
+
+ // ignore calling delete on someone else's field
+ if (pFieldDecl->getParent() != destructorDecl->getParent() )
+ return true;
+
+ if (ignoreLocation(pFieldDecl))
+ return true;
+ // to ignore things like the CPPUNIT macros
+ StringRef aFileName = compiler.getSourceManager().getFilename(compiler.getSourceManager().getSpellingLoc(pFieldDecl->getLocStart()));
+ if (aFileName.startswith(WORKDIR))
+ return true;
+ // weird stuff, passing pointers to internal members of struct
+ if (aFileName.startswith(SRCDIR "/include/jvmfwk/framework.hxx"))
+ return true;
+ if (aFileName.startswith(SRCDIR "/jvmfwk/"))
+ return true;
+ // passes and stores pointers to member fields
+ if (aFileName.startswith(SRCDIR "/sot/source/sdstor/stgdir.hxx"))
+ return true;
+ // passes and stores pointers to member fields
+ if (aFileName.startswith(SRCDIR "/desktop/source/migration/services/jvmfwk.cxx"))
+ return true;
+ // something platform-specific
+ if (aFileName.startswith(SRCDIR "/hwpfilter/source/htags.h"))
+ return true;
+ // @TODO there is clearly a bug in the ownership here, the operator= method cannot be right
+ if (aFileName.startswith(SRCDIR "/include/formula/formdata.hxx"))
+ return true;
+ // passes pointers to member fields
+ if (aFileName.startswith(SRCDIR "/sd/inc/sdpptwrp.hxx"))
+ return true;
+ // @TODO there is clearly a bug in the ownership here, the ScJumpMatrixToken copy constructor cannot be right
+ if (aFileName.startswith(SRCDIR "/sc/inc/token.hxx"))
+ return true;
+ // @TODO intrusive linked-lists here, with some trickiness
+ if (aFileName.startswith(SRCDIR "/sw/source/filter/html/parcss1.hxx"))
+ return true;
+ // @TODO SwDoc has some weird ref-counting going on
+ if (aFileName.startswith(SRCDIR "/sw/inc/shellio.hxx"))
+ return true;
+
+ report(
+ DiagnosticsEngine::Warning,
+ "a destructor with only a single unconditional call to delete on a member, is a sure sign it should be using std::unique_ptr for that field",
+ deleteExpr->getLocStart())
+ << deleteExpr->getSourceRange();
+ report(
+ DiagnosticsEngine::Note,
+ "member is here",
+ pFieldDecl->getLocStart())
+ << pFieldDecl->getSourceRange();
+ return true;
+}
+
+loplugin::Plugin::Registration< UseUniquePtr > X("useuniqueptr");
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/hwpfilter/source/hwpreader.cxx b/hwpfilter/source/hwpreader.cxx
index f353bd7..68388d1 100644
--- a/hwpfilter/source/hwpreader.cxx
+++ b/hwpfilter/source/hwpreader.cxx
@@ -108,13 +108,12 @@ struct HwpReaderPrivate
HwpReader::HwpReader()
{
mxList = new AttributeListImpl;
- d = new HwpReaderPrivate;
+ d.reset( new HwpReaderPrivate );
}
HwpReader::~HwpReader()
{
- delete d;
}
extern "C" SAL_DLLPUBLIC_EXPORT bool SAL_CALL TestImportHWP(const OUString &rURL)
diff --git a/hwpfilter/source/hwpreader.hxx b/hwpfilter/source/hwpreader.hxx
index d1dbd16..c44a0c3 100644
--- a/hwpfilter/source/hwpreader.hxx
+++ b/hwpfilter/source/hwpreader.hxx
@@ -19,6 +19,7 @@
#ifndef INCLUDED_HWPFILTER_SOURCE_HWPREADER_HXX
#define INCLUDED_HWPFILTER_SOURCE_HWPREADER_HXX
+
#include <errno.h>
#include <stdio.h>
#include <string.h>
@@ -40,6 +41,7 @@
#include <cppuhelper/implbase.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <cppuhelper/weak.hxx>
+#include <memory>
using namespace ::cppu;
using namespace ::com::sun::star::lang;
@@ -92,7 +94,7 @@ private:
Reference< XDocumentHandler > m_rxDocumentHandler;
rtl::Reference<AttributeListImpl> mxList;
HWPFile hwpfile;
- HwpReaderPrivate *d;
+ std::unique_ptr<HwpReaderPrivate> d;
private:
/* -------- Document Parsing --------- */
void makeMeta();
diff --git a/include/basegfx/raster/bpixelraster.hxx b/include/basegfx/raster/bpixelraster.hxx
index f85c0af..46ef649 100644
--- a/include/basegfx/raster/bpixelraster.hxx
+++ b/include/basegfx/raster/bpixelraster.hxx
@@ -38,13 +38,13 @@ namespace basegfx
sal_uInt32 mnWidth;
sal_uInt32 mnHeight;
sal_uInt32 mnCount;
- BPixel* mpContent;
+ std::unique_ptr<BPixel[]> mpContent;
public:
// reset
void reset()
{
- memset(mpContent, 0, sizeof(BPixel) * mnCount);
+ memset(mpContent.get(), 0, sizeof(BPixel) * mnCount);
}
// constructor/destructor
@@ -59,7 +59,6 @@ namespace basegfx
~BPixelRaster()
{
- delete [] mpContent;
}
// coordinate calcs between X/Y and span
diff --git a/include/basegfx/raster/bzpixelraster.hxx b/include/basegfx/raster/bzpixelraster.hxx
index 722abde..3e0d51b 100644
--- a/include/basegfx/raster/bzpixelraster.hxx
+++ b/include/basegfx/raster/bzpixelraster.hxx
@@ -30,7 +30,7 @@ namespace basegfx
{
protected:
// additionally, host a ZBuffer
- sal_uInt16* mpZBuffer;
+ std::unique_ptr<sal_uInt16[]> mpZBuffer;
public:
// constructor/destructor
@@ -38,12 +38,11 @@ namespace basegfx
: BPixelRaster(nWidth, nHeight),
mpZBuffer(new sal_uInt16[mnCount])
{
- memset(mpZBuffer, 0, sizeof(sal_uInt16) * mnCount);
+ memset(mpZBuffer.get(), 0, sizeof(sal_uInt16) * mnCount);
}
~BZPixelRaster()
{
- delete [] mpZBuffer;
}
// data access read only
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx
index 23a7122..420ac67 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -1919,7 +1919,6 @@ WW8_WrPlcSubDoc::WW8_WrPlcSubDoc()
WW8_WrPlcSubDoc::~WW8_WrPlcSubDoc()
{
- delete pTextPos;
}
void WW8_WrPlcFootnoteEdn::Append( WW8_CP nCp, const SwFormatFootnote& rFootnote )
@@ -2002,7 +2001,7 @@ bool WW8_WrPlcSubDoc::WriteGenericText( WW8Export& rWrt, sal_uInt8 nTTyp,
return false;
sal_uLong nCpStart = rWrt.Fc2Cp( rWrt.Strm().Tell() );
- pTextPos = new WW8_WrPlc0( nCpStart );
+ pTextPos.reset( new WW8_WrPlc0( nCpStart ) );
sal_uInt16 i;
switch ( nTTyp )
diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx
index 10ebf2d..447e3c0 100644
--- a/sw/source/filter/ww8/wrtww8.cxx
+++ b/sw/source/filter/ww8/wrtww8.cxx
@@ -814,12 +814,11 @@ WW8_WrPlc1::WW8_WrPlc1( sal_uInt16 nStructSz )
: nStructSiz( nStructSz )
{
nDataLen = 16 * nStructSz;
- pData = new sal_uInt8[ nDataLen ];
+ pData.reset( new sal_uInt8[ nDataLen ] );
}
WW8_WrPlc1::~WW8_WrPlc1()
{
- delete[] pData;
}
WW8_CP WW8_WrPlc1::Prev() const
@@ -836,12 +835,11 @@ void WW8_WrPlc1::Append( WW8_CP nCp, const void* pNewData )
if( nDataLen < nInsPos + nStructSiz )
{
sal_uInt8* pNew = new sal_uInt8[ 2 * nDataLen ];
- memcpy( pNew, pData, nDataLen );
- delete[] pData;
- pData = pNew;
+ memcpy( pNew, pData.get(), nDataLen );
+ pData.reset(pNew);
nDataLen *= 2;
}
- memcpy( pData + nInsPos, pNewData, nStructSiz );
+ memcpy( pData.get() + nInsPos, pNewData, nStructSiz );
}
void WW8_WrPlc1::Finish( sal_uLong nLastCp, sal_uLong nSttCp )
@@ -861,7 +859,7 @@ void WW8_WrPlc1::Write( SvStream& rStrm )
for( i = 0; i < aPos.size(); ++i )
SwWW8Writer::WriteLong( rStrm, aPos[i] );
if( i )
- rStrm.WriteBytes(pData, (i-1) * nStructSiz);
+ rStrm.WriteBytes(pData.get(), (i-1) * nStructSiz);
}
// Class WW8_WrPlcField for fields
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index 6cbb890..10ccb85 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -1169,8 +1169,8 @@ private:
protected:
std::vector<WW8_CP> aCps;
std::vector<const void*> aContent; // PTRARR of SwFormatFootnote/PostIts/..
- std::vector<const SwFrameFormat*> aSpareFormats; //a backup for aContent: if there's no SdrObject, stores the fmt directly here
- WW8_WrPlc0* pTextPos; // positions of the individual texts
+ std::vector<const SwFrameFormat*> aSpareFormats; // a backup for aContent: if there's no SdrObject, stores the fmt directly here
+ std::unique_ptr<WW8_WrPlc0> pTextPos; // positions of the individual texts
WW8_WrPlcSubDoc();
virtual ~WW8_WrPlcSubDoc();
@@ -1281,7 +1281,7 @@ class WW8_WrPlc1
{
private:
std::vector<WW8_CP> aPos;
- sal_uInt8* pData; // content ( structures )
+ std::unique_ptr<sal_uInt8[]> pData; // content ( structures )
sal_uLong nDataLen;
sal_uInt16 nStructSiz;
diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx
index 039b24c..3d221b2 100644
--- a/sw/source/filter/ww8/ww8scan.cxx
+++ b/sw/source/filter/ww8/ww8scan.cxx
@@ -1123,14 +1123,12 @@ WW8PLCFx_PCD::WW8PLCFx_PCD(const WW8Fib& rFib, WW8PLCFpcd* pPLCFpcd,
: WW8PLCFx(rFib, false), nClipStart(-1)
{
// construct own iterator
- pPcdI = new WW8PLCFpcd_Iter(*pPLCFpcd, nStartCp);
+ pPcdI.reset( new WW8PLCFpcd_Iter(*pPLCFpcd, nStartCp) );
bVer67= bVer67P;
}
WW8PLCFx_PCD::~WW8PLCFx_PCD()
{
- // pPcd-Dtor which in called from WW8ScannerBase
- delete pPcdI;
}
sal_uInt32 WW8PLCFx_PCD::GetIMax() const
@@ -3098,8 +3096,8 @@ WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTableSt,
{
ResetAttrStartEnd();
- pPcd = rSBase.m_pPiecePLCF ? new WW8PLCFx_PCD(GetFIB(),
- rBase.m_pPiecePLCF, 0, IsSevenMinus(GetFIBVersion())) : nullptr;
+ if (rSBase.m_pPiecePLCF)
+ pPcd.reset( new WW8PLCFx_PCD(GetFIB(), rBase.m_pPiecePLCF, 0, IsSevenMinus(GetFIBVersion())) );
/*
Make a copy of the piece attributes for so that the calls to HasSprm on a
@@ -3110,7 +3108,7 @@ WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTableSt,
if (pPcd)
{
pPCDAttrs = rSBase.m_pPLCFx_PCDAttrs ? new WW8PLCFx_PCDAttrs(
- *rSBase.m_pWw8Fib, pPcd, &rSBase) : nullptr;
+ *rSBase.m_pWw8Fib, pPcd.get(), &rSBase) : nullptr;
}
pPieceIter = rSBase.m_pPieceIter;
@@ -3118,7 +3116,6 @@ WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTableSt,
WW8PLCFx_Cp_FKP::~WW8PLCFx_Cp_FKP()
{
- delete pPcd;
}
void WW8PLCFx_Cp_FKP::ResetAttrStartEnd()
@@ -3680,12 +3677,11 @@ WW8PLCFx_FLD::WW8PLCFx_FLD( SvStream* pSt, const WW8Fib& rMyFib, short nType)
}
if( nLen )
- pPLCF = new WW8PLCFspecial( pSt, nFc, nLen, 2 );
+ pPLCF.reset( new WW8PLCFspecial( pSt, nFc, nLen, 2 ) );
}
WW8PLCFx_FLD::~WW8PLCFx_FLD()
{
- delete pPLCF;
}
sal_uInt32 WW8PLCFx_FLD::GetIdx() const
diff --git a/sw/source/filter/ww8/ww8scan.hxx b/sw/source/filter/ww8/ww8scan.hxx
index fab1906..d5a0ff7 100644
--- a/sw/source/filter/ww8/ww8scan.hxx
+++ b/sw/source/filter/ww8/ww8scan.hxx
@@ -27,6 +27,7 @@
#include <cassert>
#include <cstddef>
#include <list>
+#include <memory>
#include <stack>
#include <unordered_map>
#include <vector>
@@ -446,7 +447,7 @@ public:
class WW8PLCFx_PCD : public WW8PLCFx // iterator for Piece table
{
private:
- WW8PLCFpcd_Iter* pPcdI;
+ std::unique_ptr<WW8PLCFpcd_Iter> pPcdI;
bool bVer67;
WW8_CP nClipStart;
@@ -468,7 +469,7 @@ public:
WW8_FC AktPieceStartCp2Fc( WW8_CP nCp );
static void AktPieceFc2Cp(WW8_CP& rStartPos, WW8_CP& rEndPos,
const WW8ScannerBase *pSBase);
- WW8PLCFpcd_Iter* GetPLCFIter() { return pPcdI; }
+ WW8PLCFpcd_Iter* GetPLCFIter() { return pPcdI.get(); }
void SetClipStart(WW8_CP nIn) { nClipStart = nIn; }
WW8_CP GetClipStart() { return nClipStart; }
@@ -612,7 +613,7 @@ class WW8PLCFx_Cp_FKP : public WW8PLCFx_Fc_FKP
{
private:
const WW8ScannerBase& rSBase;
- WW8PLCFx_PCD* pPcd;
+ std::unique_ptr<WW8PLCFx_PCD> pPcd;
WW8PLCFpcd_Iter *pPieceIter;
WW8_CP nAttrStart, nAttrEnd;
bool bLineEnd : 1;
@@ -703,7 +704,7 @@ public:
class WW8PLCFx_FLD : public WW8PLCFx
{
private:
- WW8PLCFspecial* pPLCF;
+ std::unique_ptr<WW8PLCFspecial> pPLCF;
const WW8Fib& rFib;
WW8PLCFx_FLD(const WW8PLCFx_FLD&) = delete;
WW8PLCFx_FLD& operator=(const WW8PLCFx_FLD &) = delete;
diff --git a/sw/source/filter/ww8/ww8toolbar.cxx b/sw/source/filter/ww8/ww8toolbar.cxx
index ae31723..0d66d77 100644
--- a/sw/source/filter/ww8/ww8toolbar.cxx
+++ b/sw/source/filter/ww8/ww8toolbar.cxx
@@ -1097,7 +1097,6 @@ TcgSttbfCore::TcgSttbfCore() : fExtend( 0 )
TcgSttbfCore::~TcgSttbfCore()
{
- delete[] dataItems;
}
bool TcgSttbfCore::Read( SvStream& rS )
@@ -1109,7 +1108,7 @@ bool TcgSttbfCore::Read( SvStream& rS )
{
if (cData > rS.remainingSize() / 4) //definitely an invalid record
return false;
- dataItems = new SBBItem[ cData ];
+ dataItems.reset( new SBBItem[ cData ] );
for ( sal_Int32 index = 0; index < cData; ++index )
{
rS.ReadUInt16( dataItems[ index ].cchData );
@@ -1145,7 +1144,6 @@ MacroNames::MacroNames() :
MacroNames::~MacroNames()
{
- delete[] rgNames;
}
bool MacroNames::Read( SvStream &rS)
@@ -1160,7 +1158,7 @@ bool MacroNames::Read( SvStream &rS)
size_t nMaxAvailableRecords = rS.remainingSize()/sizeof(sal_uInt16);
if (iMac > nMaxAvailableRecords)
return false;
- rgNames = new MacroName[ iMac ];
+ rgNames.reset( new MacroName[ iMac ] );
for ( sal_Int32 index = 0; index < iMac; ++index )
{
if ( !rgNames[ index ].Read( rS ) )
diff --git a/sw/source/filter/ww8/ww8toolbar.hxx b/sw/source/filter/ww8/ww8toolbar.hxx
index c37176f..e98f664 100644
--- a/sw/source/filter/ww8/ww8toolbar.hxx
+++ b/sw/source/filter/ww8/ww8toolbar.hxx
@@ -11,6 +11,7 @@
#include <com/sun/star/container/XIndexContainer.hpp>
#include <filter/msfilter/mstoolbar.hxx>
+#include <memory>
class Xst : public TBBase
{
@@ -294,7 +295,7 @@ class TcgSttbfCore : public TBBase
sal_uInt16 fExtend;
sal_uInt16 cData;
sal_uInt16 cbExtra;
- SBBItem* dataItems;
+ std::unique_ptr<SBBItem[]> dataItems;
TcgSttbfCore(const TcgSttbfCore&) = delete;
TcgSttbfCore& operator = ( const TcgSttbfCore&) = delete;
@@ -358,7 +359,7 @@ public:
class MacroNames : public Tcg255SubStruct
{
sal_uInt16 iMac; //An unsigned integer that specifies the number of MacroName structures in rgNames.
- MacroName* rgNames;
+ std::unique_ptr<MacroName[]> rgNames;
MacroNames(const MacroNames&) = delete;
MacroNames& operator = ( const MacroNames&) = delete;
diff --git a/sw/source/ui/index/swuiidxmrk.cxx b/sw/source/ui/index/swuiidxmrk.cxx
index bcf1905..199d3ec 100644
--- a/sw/source/ui/index/swuiidxmrk.cxx
+++ b/sw/source/ui/index/swuiidxmrk.cxx
@@ -949,14 +949,12 @@ IMPL_LINK( SwIndexMarkPane, KeyDCBModifyHdl, Edit&, rEdit, void )
SwIndexMarkPane::~SwIndexMarkPane()
{
- delete pTOXMgr;
}
void SwIndexMarkPane::ReInitDlg(SwWrtShell& rWrtShell, SwTOXMark* pCurTOXMark)
{
pSh = &rWrtShell;
- delete pTOXMgr;
- pTOXMgr = new SwTOXMgr(pSh);
+ pTOXMgr.reset( new SwTOXMgr(pSh) );
if(pCurTOXMark)
{
for(sal_uInt16 i = 0; i < pTOXMgr->GetTOXMarkCount(); i++)
diff --git a/sw/source/uibase/inc/swuiidxmrk.hxx b/sw/source/uibase/inc/swuiidxmrk.hxx
index 609e2d1..2ae2ab4 100644
--- a/sw/source/uibase/inc/swuiidxmrk.hxx
+++ b/sw/source/uibase/inc/swuiidxmrk.hxx
@@ -35,6 +35,7 @@
#include <sfx2/childwin.hxx>
#include "toxe.hxx"
#include <com/sun/star/i18n/XExtendedIndexEntrySupplier.hpp>
+#include <memory>
class SwWrtShell;
class SwTOXMgr;
@@ -99,7 +100,8 @@ class SwIndexMarkPane
css::uno::Reference< css::i18n::XExtendedIndexEntrySupplier >
xExtendedIndexEntrySupplier;
- SwTOXMgr* pTOXMgr;
+ std::unique_ptr<SwTOXMgr>
+ pTOXMgr;
SwWrtShell* pSh;
void Apply();
More information about the Libreoffice-commits
mailing list