diff options
author | Takeshi Abe <tabe@fixedpoint.jp> | 2014-07-16 17:41:15 +0900 |
---|---|---|
committer | Takeshi Abe <tabe@fixedpoint.jp> | 2014-07-16 18:01:39 +0900 |
commit | d97b5e420fdb18e9c99403ac66c429fb80a2f27f (patch) | |
tree | c8b15769e1f10bccdfb2d4d006bd871bef5863af | |
parent | 9a6cf48618fcf586cd6c1e390cd49bc1f5d4631d (diff) |
Avoid possible memory leaks in case of exceptions
Change-Id: Icecc2cce52d7f27c030270639e6b85877e3aa620
-rw-r--r-- | basic/source/classes/image.cxx | 17 | ||||
-rw-r--r-- | basic/source/classes/sb.cxx | 5 | ||||
-rw-r--r-- | basic/source/comp/dim.cxx | 8 |
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(); } } |