I have xerces 2.7 on a redhat 7.3 and I have a memory leak of about 12 k
when I run the parse() method of XercesDOMParser .
Belowe I copy the code involved.
Is there an error in the code or is this a bug ?
/***********************************************************************
******************/
int
util_xerces::BuildDomParser( XercesDOMParser ** domParser )
{
int iret;
( *domParser ) = new XercesDOMParser;
( *domParser )->setValidationScheme( XercesDOMParser::Val_Auto );
( *domParser )->setDoNamespaces( false );
( *domParser )->setDoSchema( false );
( *domParser )->setValidationSchemaFullChecking( false );
( *domParser )->setCreateEntityReferenceNodes( true );
iret = IRET_OK;
return iret;
} // _________ void util_xerces::BuildDomParser( )
/***********************************************************************
******************/
int
util_xerces::ParseXmlToDoc( string strXmlInp, DOMDocument ** pDoc )
{
XercesDOMParser *pDomParserInput = 0;
DOMTreeErrorReporter *errReporter = 0;
int iret = IRET_ERROR;
string Fun = "[ParseXmlToDoc] ";
*pDoc = 0;
//
------------------------------------------------------------------------
--
util_xerces::BuildDomParser( &pDomParserInput );
errReporter = new DOMTreeErrorReporter( );
pDomParserInput->setErrorHandler( ( ErrorHandler * ) errReporter );
//
------------------------------------------------------------------------
--
// strXmlInp is a short string like this : "<Messaggio TipoMsg=\"S\"
/>"
//
------------------------------------------------------------------------
--
string sfile;
sfile = ae_util::format_string( "/var/log/xml/tmp_inp_%d.xml", getpid(
) );
std::ofstream out_file( sfile.c_str( ) );
out_file << strXmlInp;
out_file.close( );
//
------------------------------------------------------------------------
--
try
{
pDomParserInput->parse( sfile.c_str( ) );
for( int ix = 0; ix < 5; ix++ )
{
MYLOG( Fun + ae_util::format_string( " memoria allocata = %d ",
ae_util::MemoriaProcesso( 0 ) ));
pDomParserInput->parse( sfile.c_str( ) );
}
unlink( sfile.c_str( ) );
}
catch( const XMLException & e )
{
MYERR( ae_util::
format_string( "[util_xerces::ParseXmlToDoc] XMLException
parse ERROR %s [XML:%s]",
S( e.getMessage( ) ).c_str( ),
strXmlInp.c_str( ) ) );
}
catch( const DOMException & e )
{
const unsigned int maxChars = 2047;
XMLCh errText[maxChars + 1];
char *sMsg;
if( DOMImplementation::loadDOMExceptionMsg( e.code, errText,
maxChars ) )
{
sMsg = XMLString::transcode( errText );
MYERR( ae_util::
format_string( "[util_xerces::ParseXmlToDoc] DOMException
parse ERROR %d -> %s ",
e.code, sMsg ) );
XMLString::release( &sMsg );
}
}
catch( ... )
{
MYERR( ae_util::format_string( "[util_xerces::ParseXmlToDoc] parse
ERROR [XML:%s]",
strXmlInp.c_str( ) ) );
}
................
_____ the output is as follow: [][20090108_103115 PID:6682.6626] [TestMemoryLeak] START - memoria allocata = 4184 [][20090108_103115 PID:6682.6626] [TestMemoryLeak] InputMSG=[<Messaggio TipoMsg="S" />] [][20090108_103115 PID:6682.6626] [ParseXmlToDoc] memoria allocata = 4220 [][20090108_103115 PID:6682.6626] [ParseXmlToDoc] memoria allocata = 4232 [][20090108_103115 PID:6682.6626] [ParseXmlToDoc] memoria allocata = 4244 [][20090108_103115 PID:6682.6626] [ParseXmlToDoc] memoria allocata = 4256 [][20090108_103115 PID:6682.6626] [ParseXmlToDoc] memoria allocata = 4264
<<winmail.dat>>
--------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
