[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xerces-c-dev
Subject:    Re: R: parse memory leak
From:       Alberto Massari <amassari () datadirect ! com>
Date:       2009-01-08 10:10:35
Message-ID: 4965D11B.1070503 () datadirect ! com
[Download RAW message or body]

Hi Enzo,
every parsed file is stored in a cache (unless you invoke adoptDocument 
to decide to own its lifetime by yourself); the cache is emptied when 
you call release() on the parser object. Your code doesn't release 
neither the parser or the error handler; try printing the memory 
allocated after you delete both objects.

Alberto

Enzo Arlati wrote:
>  
> 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*
>  
>  


---------------------------------------------------------------------
To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: c-dev-help@xerces.apache.org

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic