summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi Abe <tabe@fixedpoint.jp>2014-07-16 17:41:15 +0900
committerTakeshi Abe <tabe@fixedpoint.jp>2014-07-16 18:01:39 +0900
commitd97b5e420fdb18e9c99403ac66c429fb80a2f27f (patch)
treec8b15769e1f10bccdfb2d4d006bd871bef5863af
parent9a6cf48618fcf586cd6c1e390cd49bc1f5d4631d (diff)
Avoid possible memory leaks in case of exceptions
Change-Id: Icecc2cce52d7f27c030270639e6b85877e3aa620
-rw-r--r--basic/source/classes/image.cxx17
-rw-r--r--basic/source/classes/sb.cxx5
-rw-r--r--basic/source/comp/dim.cxx8
3 files changed, 15 insertions, 15 deletions
diff --git a/basic/source/classes/image.cxx b/basic/source/classes/image.cxx
index ae016b152704..784a1c509996 100644
--- a/basic/source/classes/image.cxx
+++ b/basic/source/classes/image.cxx
@@ -25,6 +25,8 @@
#include <string.h>
#include "image.hxx"
#include <codegen.hxx>
+#include <boost/scoped_array.hpp>
+
SbiImage::SbiImage()
{
pStringOff = NULL;
@@ -206,15 +208,14 @@ bool SbiImage::Load( SvStream& r, sal_uInt32& nVersion )
pStrings = new sal_Unicode[ nLen ];
nStringSize = (sal_uInt16) nLen;
- char* pByteStrings = new char[ nLen ];
- r.Read( pByteStrings, nStringSize );
+ boost::scoped_array<char> pByteStrings(new char[ nLen ]);
+ r.Read( pByteStrings.get(), nStringSize );
for( short j = 0; j < nStrings; j++ )
{
sal_uInt16 nOff2 = (sal_uInt16) pStringOff[ j ];
- OUString aStr( pByteStrings + nOff2, strlen(pByteStrings + nOff2), eCharSet );
+ OUString aStr( pByteStrings.get() + nOff2, strlen(pByteStrings.get() + nOff2), eCharSet );
memcpy( pStrings + nOff2, aStr.getStr(), (aStr.getLength() + 1) * sizeof( sal_Unicode ) );
}
- delete[] pByteStrings;
}
break;
case B_MODEND:
@@ -324,17 +325,17 @@ bool SbiImage::Save( SvStream& r, sal_uInt32 nVer )
r.WriteUInt32( (sal_uInt32) pStringOff[ i ] );
}
// Then the String-Block
- char* pByteStrings = new char[ nStringSize ];
+ boost::scoped_array<char> pByteStrings(new char[ nStringSize ]);
for( i = 0; i < nStrings; i++ )
{
sal_uInt16 nOff = (sal_uInt16) pStringOff[ i ];
OString aStr(OUStringToOString(OUString(pStrings + nOff), eCharSet));
- memcpy( pByteStrings + nOff, aStr.getStr(), (aStr.getLength() + 1) * sizeof( char ) );
+ memcpy( pByteStrings.get() + nOff, aStr.getStr(), (aStr.getLength() + 1) * sizeof( char ) );
}
r.WriteUInt32( (sal_uInt32) nStringSize );
- r.Write( pByteStrings, nStringSize );
+ r.Write( pByteStrings.get(), nStringSize );
- delete[] pByteStrings;
+ pByteStrings.reset();
SbiCloseRecord( r, nPos );
}
// Set overall length
diff --git a/basic/source/classes/sb.cxx b/basic/source/classes/sb.cxx
index 922df3e82b8e..61a1d723f895 100644
--- a/basic/source/classes/sb.cxx
+++ b/basic/source/classes/sb.cxx
@@ -46,6 +46,7 @@
#include <com/sun/star/util/XCloseBroadcaster.hpp>
#include <com/sun/star/util/XCloseListener.hpp>
#include "errobject.hxx"
+#include <boost/scoped_array.hpp>
#include <boost/unordered_map.hpp>
#include <com/sun/star/script/ModuleType.hpp>
@@ -1872,7 +1873,7 @@ bool StarBASIC::LoadData( SvStream& r, sal_uInt16 nVer )
// #95459 Delete dialogs, otherwise endless recursion
// in SbxVarable::GetType() if dialogs are accessed
sal_uInt16 nObjCount = pObjs->Count();
- SbxVariable** ppDeleteTab = new SbxVariable*[ nObjCount ];
+ boost::scoped_array<SbxVariable*> ppDeleteTab(new SbxVariable*[ nObjCount ]);
sal_uInt16 nObj;
for( nObj = 0 ; nObj < nObjCount ; nObj++ )
@@ -1889,7 +1890,7 @@ bool StarBASIC::LoadData( SvStream& r, sal_uInt16 nVer )
pObjs->Remove( pVar );
}
}
- delete[] ppDeleteTab;
+ ppDeleteTab.reset();
sal_uInt16 nMod;
pModules->Clear();
diff --git a/basic/source/comp/dim.cxx b/basic/source/comp/dim.cxx
index e5e4c162bcda..a6625152aa22 100644
--- a/basic/source/comp/dim.cxx
+++ b/basic/source/comp/dim.cxx
@@ -588,7 +588,7 @@ void SbiParser::DefType( bool bPrivate )
SbxObject *pType = new SbxObject(aSym);
- SbiSymDef* pElem;
+ boost::scoped_ptr<SbiSymDef> pElem;
SbiDimList* pDim = NULL;
bool bDone = false;
@@ -597,19 +597,17 @@ void SbiParser::DefType( bool bPrivate )
switch( Peek() )
{
case ENDTYPE :
- pElem = NULL;
bDone = true;
Next();
break;
case EOLN :
case REM :
- pElem = NULL;
Next();
break;
default:
- pElem = VarDecl(&pDim, false, false);
+ pElem.reset(VarDecl(&pDim, false, false));
if( !pElem )
bDone = true; // Error occurred
}
@@ -678,7 +676,7 @@ void SbiParser::DefType( bool bPrivate )
pTypeMembers->Insert( pTypeElem, pTypeMembers->Count() );
}
delete pDim, pDim = NULL;
- delete pElem;
+ pElem.reset();
}
}