sw/inc/index.hxx | 12 ++++++------ sw/source/core/bastyp/index.cxx | 4 ++-- sw/source/core/bastyp/init.cxx | 4 ---- sw/source/core/crsr/crsrsh.cxx | 2 +- 4 files changed, 9 insertions(+), 13 deletions(-)
New commits: commit e1945ba903faa567d90addaf13a0eb8a2f688d15 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Sep 19 23:33:09 2011 +0200 Do not delete SwIndexReg::pEmptyIndexArray while SwXTextCursor instances can still reference it. Found during termination of sw/qa/unoapi soffice.bin run under Valgrind/memcheck. diff --git a/sw/inc/index.hxx b/sw/inc/index.hxx index 551e31d..2a3a792 100644 --- a/sw/inc/index.hxx +++ b/sw/inc/index.hxx @@ -29,6 +29,8 @@ #define _INDEX_HXX #include <limits.h> + +#include "rtl/instance.hxx" #include <tools/solar.h> #include <tools/rtti.hxx> // for RTTI of SwIndexReg #include <tools/string.hxx> // for xub_StrLen @@ -117,12 +119,6 @@ class SwIndexReg const SwIndex *pFirst, *pLast, *pMiddle; - // A global array for holding indices that need to be "swapped" temporarily - // or do not know a valid array (SwPaM/SwPosition!). - friend void _InitCore(); - friend void _FinitCore(); - static SwIndexReg* pEmptyIndexArray; - protected: virtual void Update( SwIndex const & rPos, const xub_StrLen nChangeLen, const bool bNegative = false, const bool bDelete = false ); @@ -142,6 +138,10 @@ public: void MoveTo( SwIndexReg& rArr ); }; +// A global array for holding indices that need to be "swapped" temporarily or +// do not know a valid array (SwPaM/SwPosition!): +struct EmptyIndexArray: rtl::Static< SwIndexReg, EmptyIndexArray > {}; + #if !defined(OSL_DEBUG_LEVEL) || OSL_DEBUG_LEVEL < 2 inline xub_StrLen SwIndex::operator++() diff --git a/sw/source/core/bastyp/index.cxx b/sw/source/core/bastyp/index.cxx index 84db722..bff5760 100644 --- a/sw/source/core/bastyp/index.cxx +++ b/sw/source/core/bastyp/index.cxx @@ -48,7 +48,7 @@ SwIndex::SwIndex(SwIndexReg *const pArr, xub_StrLen const nIdx) { if( !pArray ) { - pArray = SwIndexReg::pEmptyIndexArray; + pArray = &EmptyIndexArray::get(); nIndex = 0; // steht immer auf 0 !!! } @@ -225,7 +225,7 @@ SwIndex& SwIndex::Assign( SwIndexReg* pArr, xub_StrLen nIdx ) { if( !pArr ) { - pArr = SwIndexReg::pEmptyIndexArray; + pArr = &EmptyIndexArray::get(); nIdx = 0; // steht immer auf 0 !!! } diff --git a/sw/source/core/bastyp/init.cxx b/sw/source/core/bastyp/init.cxx index 1e3e5dc..72e6ec4 100644 --- a/sw/source/core/bastyp/init.cxx +++ b/sw/source/core/bastyp/init.cxx @@ -430,7 +430,6 @@ sal_uInt16* SwAttrPool::pVersionMap4 = 0; // #i18732# sal_uInt16* SwAttrPool::pVersionMap5 = 0; sal_uInt16* SwAttrPool::pVersionMap6 = 0; -SwIndexReg* SwIndexReg::pEmptyIndexArray = 0; const sal_Char* pMarkToTable = "table"; const sal_Char* pMarkToFrame = "frame"; @@ -725,8 +724,6 @@ void _InitCore() SwSelPaintRects::pMapMode = new MapMode; SwFntObj::pPixMap = new MapMode; - SwIndexReg::pEmptyIndexArray = new SwIndexReg; - pGlobalOLEExcludeList = new SvPtrarr; const SvxSwAutoFmtFlags& rAFlags = SvxAutoCorrCfg::Get().GetAutoCorrect()->GetSwFlags(); @@ -813,7 +810,6 @@ void _FinitCore() ::ClearFEShellTabCols(); - delete SwIndexReg::pEmptyIndexArray; delete[] SwAttrPool::pVersionMap1; delete[] SwAttrPool::pVersionMap2; delete[] SwAttrPool::pVersionMap3; diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx index 6278e62..8a8cd4e 100644 --- a/sw/source/core/crsr/crsrsh.cxx +++ b/sw/source/core/crsr/crsrsh.cxx @@ -3164,7 +3164,7 @@ const SwStartNode* lcl_NodeContext( const SwNode& rNode ) bool lcl_PosOk(const SwPosition & aPos) { return NULL != aPos.nNode.GetNode().GetCntntNode() && - SwIndexReg::pEmptyIndexArray != aPos.nContent.GetIdxReg(); + &EmptyIndexArray::get() != aPos.nContent.GetIdxReg(); } /** _______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits