diff options
author | Takeshi Abe <tabe@fixedpoint.jp> | 2014-05-01 00:51:44 +0900 |
---|---|---|
committer | Takeshi Abe <tabe@fixedpoint.jp> | 2014-05-01 00:53:27 +0900 |
commit | ecec7cea259e7310cb6da33bea797c98a635a2b3 (patch) | |
tree | 308fed0bd26ad4a3f4d6474e13f70e6c1633525a /sc | |
parent | ebe854c9d967ed1ec4eee40db984717c2275f722 (diff) |
Avoid possible memory leaks in case of exceptions
Change-Id: Id6590e6c1d3ec1640ebf55d348670953450dd419
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/data/documen4.cxx | 24 | ||||
-rw-r--r-- | sc/source/core/tool/addincol.cxx | 25 | ||||
-rw-r--r-- | sc/source/core/tool/appoptio.cxx | 7 | ||||
-rw-r--r-- | sc/source/core/tool/consoli.cxx | 12 | ||||
-rw-r--r-- | sc/source/core/tool/detfunc.cxx | 13 |
5 files changed, 34 insertions, 47 deletions
diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index 88af3ce797da..a156c3ba8529 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -1186,9 +1186,9 @@ void ScDocument::CompareDocument( ScDocument& rOtherDoc ) aProText.makeStringAndClear(), 3*nThisEndRow ); // 2x FindOrder, 1x hier long nProgressStart = 2*nThisEndRow; // start fuer hier - SCCOLROW* pTempRows = new SCCOLROW[nThisEndRow+1]; - SCCOLROW* pOtherRows = new SCCOLROW[nThisEndRow+1]; - SCCOLROW* pOtherCols = new SCCOLROW[nThisEndCol+1]; + boost::scoped_array<SCCOLROW> pTempRows(new SCCOLROW[nThisEndRow+1]); + boost::scoped_array<SCCOLROW> pOtherRows(new SCCOLROW[nThisEndRow+1]); + boost::scoped_array<SCCOLROW> pOtherCols(new SCCOLROW[nThisEndCol+1]); // eingefuegte/geloeschte Spalten/Zeilen finden: // Zwei Versuche: @@ -1199,14 +1199,14 @@ void ScDocument::CompareDocument( ScDocument& rOtherDoc ) //! Spalten vergleichen zweimal mit unterschiedlichem nMinGood ??? // 1 - FindOrder( pTempRows, nThisEndRow, nOtherEndRow, false, + FindOrder( pTempRows.get(), nThisEndRow, nOtherEndRow, false, rOtherDoc, nThisTab, nOtherTab, nEndCol, NULL, &aProgress, 0 ); // 2 - FindOrder( pOtherCols, nThisEndCol, nOtherEndCol, true, + FindOrder( pOtherCols.get(), nThisEndCol, nOtherEndCol, true, rOtherDoc, nThisTab, nOtherTab, nEndRow, NULL, NULL, 0 ); - FindOrder( pOtherRows, nThisEndRow, nOtherEndRow, false, + FindOrder( pOtherRows.get(), nThisEndRow, nOtherEndRow, false, rOtherDoc, nThisTab, nOtherTab, nThisEndCol, - pOtherCols, &aProgress, nThisEndRow ); + pOtherCols.get(), &aProgress, nThisEndRow ); sal_uLong nMatch1 = 0; // pTempRows, keine Spalten for (nThisRow = 0; nThisRow<=nThisEndRow; nThisRow++) @@ -1220,7 +1220,7 @@ void ScDocument::CompareDocument( ScDocument& rOtherDoc ) if (ValidRow(pOtherRows[nThisRow])) nMatch2 += SC_DOCCOMP_MAXDIFF - RowDifferences( nThisRow, nThisTab, rOtherDoc, pOtherRows[nThisRow], - nOtherTab, nThisEndCol, pOtherCols ); + nOtherTab, nThisEndCol, pOtherCols.get() ); if ( nMatch1 >= nMatch2 ) // ohne Spalten ? { @@ -1229,9 +1229,7 @@ void ScDocument::CompareDocument( ScDocument& rOtherDoc ) pOtherCols[nThisCol] = nThisCol; // Zeilenarrays vertauschen (geloescht werden sowieso beide) - SCCOLROW* pSwap = pTempRows; - pTempRows = pOtherRows; - pOtherRows = pSwap; + pTempRows.swap(pOtherRows); } else { @@ -1351,10 +1349,6 @@ void ScDocument::CompareDocument( ScDocument& rOtherDoc ) } aProgress.SetStateOnPercent(nProgressStart+nThisRow); } - - delete[] pOtherCols; - delete[] pOtherRows; - delete[] pTempRows; } } } diff --git a/sc/source/core/tool/addincol.cxx b/sc/source/core/tool/addincol.cxx index 77f679539248..50cf24782f9b 100644 --- a/sc/source/core/tool/addincol.cxx +++ b/sc/source/core/tool/addincol.cxx @@ -52,6 +52,7 @@ #include "funcdesc.hxx" #include "svl/sharedstring.hxx" #include "formulaopt.hxx" +#include <boost/scoped_array.hpp> using namespace com::sun::star; @@ -489,7 +490,7 @@ void ScUnoAddInCollection::ReadConfiguration() // get argument info - ScAddInArgDesc* pVisibleArgs = NULL; + boost::scoped_array<ScAddInArgDesc> pVisibleArgs; long nVisibleCount = 0; long nCallerPos = SC_CALLERPOS_NONE; @@ -532,7 +533,7 @@ void ScUnoAddInCollection::ReadConfiguration() aDesc.bOptional = false; nVisibleCount = nArgumentCount; - pVisibleArgs = new ScAddInArgDesc[nVisibleCount]; + pVisibleArgs.reset(new ScAddInArgDesc[nVisibleCount]); nIndex = 0; for ( nArgument = 0; nArgument < nArgumentCount; nArgument++ ) @@ -560,7 +561,7 @@ void ScUnoAddInCollection::ReadConfiguration() aFuncName, aLocalName, aDescription, nCategory, sHelpId, xFunc, aObject, - nVisibleCount, pVisibleArgs, nCallerPos ); + nVisibleCount, pVisibleArgs.get(), nCallerPos ); pData->SetCompNames( aCompNames ); @@ -578,8 +579,6 @@ void ScUnoAddInCollection::ReadConfiguration() ScAddInHashMap::value_type( pData->GetUpperLocal(), pData ) ); - - delete[] pVisibleArgs; } } } @@ -898,11 +897,11 @@ void ScUnoAddInCollection::ReadFromAddIn( const uno::Reference<uno::XInterface>& aDescription = "###"; } - ScAddInArgDesc* pVisibleArgs = NULL; + boost::scoped_array<ScAddInArgDesc> pVisibleArgs; if ( nVisibleCount > 0 ) { ScAddInArgDesc aDesc; - pVisibleArgs = new ScAddInArgDesc[nVisibleCount]; + pVisibleArgs.reset(new ScAddInArgDesc[nVisibleCount]); long nDestPos = 0; for (nParamPos=0; nParamPos<nParamCount; nParamPos++) { @@ -953,7 +952,7 @@ void ScUnoAddInCollection::ReadFromAddIn( const uno::Reference<uno::XInterface>& aFuncName, aLocalName, aDescription, nCategory, sHelpId, xFunc, aObject, - nVisibleCount, pVisibleArgs, nCallerPos ); + nVisibleCount, pVisibleArgs.get(), nCallerPos ); const ScUnoAddInFuncData* pData = ppFuncData[nFuncPos+nOld]; @@ -969,8 +968,6 @@ void ScUnoAddInCollection::ReadFromAddIn( const uno::Reference<uno::XInterface>& ScAddInHashMap::value_type( pData->GetUpperLocal(), pData ) ); - - delete[] pVisibleArgs; } } } @@ -1090,11 +1087,11 @@ void ScUnoAddInCollection::UpdateFromAddIn( const uno::Reference<uno::XInterface } if (bValid) { - ScAddInArgDesc* pVisibleArgs = NULL; + boost::scoped_array<ScAddInArgDesc> pVisibleArgs; if ( nVisibleCount > 0 ) { ScAddInArgDesc aDesc; - pVisibleArgs = new ScAddInArgDesc[nVisibleCount]; + pVisibleArgs.reset(new ScAddInArgDesc[nVisibleCount]); long nDestPos = 0; for (nParamPos=0; nParamPos<nParamCount; nParamPos++) { @@ -1129,13 +1126,11 @@ void ScUnoAddInCollection::UpdateFromAddIn( const uno::Reference<uno::XInterface } pOldData->SetFunction( xFunc, aObject ); - pOldData->SetArguments( nVisibleCount, pVisibleArgs ); + pOldData->SetArguments( nVisibleCount, pVisibleArgs.get() ); pOldData->SetCallerPos( nCallerPos ); if ( pFunctionList ) lcl_UpdateFunctionList( *pFunctionList, *pOldData ); - - delete[] pVisibleArgs; } } } diff --git a/sc/source/core/tool/appoptio.cxx b/sc/source/core/tool/appoptio.cxx index bc2cf5378dd9..eb9f5d3adf17 100644 --- a/sc/source/core/tool/appoptio.cxx +++ b/sc/source/core/tool/appoptio.cxx @@ -30,6 +30,7 @@ #include "sc.hrc" #include <formula/compiler.hrc> #include "miscuno.hxx" +#include <boost/scoped_array.hpp> using namespace utl; using namespace com::sun::star::uno; @@ -138,13 +139,11 @@ static void lcl_SetLastFunctions( ScAppOptions& rOpt, const Any& rValue ) if ( nCount < USHRT_MAX ) { const sal_Int32* pArray = aSeq.getConstArray(); - sal_uInt16* pUShorts = new sal_uInt16[nCount]; + boost::scoped_array<sal_uInt16> pUShorts(new sal_uInt16[nCount]); for (long i=0; i<nCount; i++) pUShorts[i] = (sal_uInt16) pArray[i]; - rOpt.SetLRUFuncList( pUShorts, sal::static_int_cast<sal_uInt16>(nCount) ); - - delete[] pUShorts; + rOpt.SetLRUFuncList( pUShorts.get(), sal::static_int_cast<sal_uInt16>(nCount) ); } } } diff --git a/sc/source/core/tool/consoli.cxx b/sc/source/core/tool/consoli.cxx index 1b5bed4fd302..7c897c0a2e4e 100644 --- a/sc/source/core/tool/consoli.cxx +++ b/sc/source/core/tool/consoli.cxx @@ -28,6 +28,7 @@ #include <math.h> #include <string.h> +#include <boost/scoped_array.hpp> #define SC_CONS_NOTFOUND -1 @@ -512,11 +513,11 @@ void ScConsData::AddData( ScDocument* pSrcDoc, SCTAB nTab, if (bColByName) ++nStartRow; if (bRowByName) ++nStartCol; OUString aTitle; - SCCOL* pDestCols = NULL; - SCROW* pDestRows = NULL; + boost::scoped_array<SCCOL> pDestCols; + boost::scoped_array<SCROW> pDestRows; if (bColByName) { - pDestCols = new SCCOL[nCol2-nStartCol+1]; + pDestCols.reset(new SCCOL[nCol2-nStartCol+1]); for (nCol=nStartCol; nCol<=nCol2; nCol++) { aTitle = pSrcDoc->GetString(nCol, nRow1, nTab); @@ -537,7 +538,7 @@ void ScConsData::AddData( ScDocument* pSrcDoc, SCTAB nTab, } if (bRowByName) { - pDestRows = new SCROW[nRow2-nStartRow+1]; + pDestRows.reset(new SCROW[nRow2-nStartRow+1]); for (nRow=nStartRow; nRow<=nRow2; nRow++) { aTitle = pSrcDoc->GetString(nCol1, nRow, nTab); @@ -607,9 +608,6 @@ void ScConsData::AddData( ScDocument* pSrcDoc, SCTAB nTab, } } } - - delete[] pDestCols; - delete[] pDestRows; } // vorher testen, wieviele Zeilen eingefuegt werden (fuer Undo) diff --git a/sc/source/core/tool/detfunc.cxx b/sc/source/core/tool/detfunc.cxx index bb7df2120574..14d6aaee5bcc 100644 --- a/sc/source/core/tool/detfunc.cxx +++ b/sc/source/core/tool/detfunc.cxx @@ -70,6 +70,7 @@ #include "cellvalue.hxx" #include <vector> +#include <boost/scoped_array.hpp> using ::std::vector; @@ -670,7 +671,7 @@ void ScDetectiveFunc::DeleteArrowsAt( SCCOL nCol, SCROW nRow, bool bDestPnt ) if (nObjCount) { long nDelCount = 0; - SdrObject** ppObj = new SdrObject*[nObjCount]; + boost::scoped_array<SdrObject*> ppObj(new SdrObject*[nObjCount]); SdrObjListIter aIter( *pPage, IM_FLAT ); SdrObject* pObject = aIter.Next(); @@ -693,7 +694,7 @@ void ScDetectiveFunc::DeleteArrowsAt( SCCOL nCol, SCROW nRow, bool bDestPnt ) for (i=1; i<=nDelCount; i++) pPage->RemoveObject( ppObj[nDelCount-i]->GetOrdNum() ); - delete[] ppObj; + ppObj.reset(); Modified(); } @@ -734,7 +735,7 @@ void ScDetectiveFunc::DeleteBox( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nR if (nObjCount) { long nDelCount = 0; - SdrObject** ppObj = new SdrObject*[nObjCount]; + boost::scoped_array<SdrObject*> ppObj(new SdrObject*[nObjCount]); SdrObjListIter aIter( *pPage, IM_FLAT ); SdrObject* pObject = aIter.Next(); @@ -759,7 +760,7 @@ void ScDetectiveFunc::DeleteBox( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nR for (i=1; i<=nDelCount; i++) pPage->RemoveObject( ppObj[nDelCount-i]->GetOrdNum() ); - delete[] ppObj; + ppObj.reset(); Modified(); } @@ -1245,7 +1246,7 @@ bool ScDetectiveFunc::DeleteAll( ScDetectiveDelete eWhat ) sal_uLong nObjCount = pPage->GetObjCount(); if (nObjCount) { - SdrObject** ppObj = new SdrObject*[nObjCount]; + boost::scoped_array<SdrObject*> ppObj(new SdrObject*[nObjCount]); SdrObjListIter aIter( *pPage, IM_FLAT ); SdrObject* pObject = aIter.Next(); @@ -1283,7 +1284,7 @@ bool ScDetectiveFunc::DeleteAll( ScDetectiveDelete eWhat ) for (i=1; i<=nDelCount; i++) pPage->RemoveObject( ppObj[nDelCount-i]->GetOrdNum() ); - delete[] ppObj; + ppObj.reset(); Modified(); } |