You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by "Mannion, Enda" <en...@hp.com> on 2005/12/16 11:54:10 UTC

Xerces Dom parser memory leak

Hi, 

 

The following code causes a 400K leak each time it is called. It seems
to occue in the following line: parser->parse(metaDataFile.c_str());

 

Has anyone had any similar parse leak issues or does this code look file
to you. Also could this code be improved in any way, I very new to this
xerces development.

 

 

String function()

{

 

xercesc_2_4::XercesDOMParser* parser = new
xercesc_2_4::XercesDOMParser();

if(parser == NULL)

{

      return "";

}

 

parser->setValidationScheme(xercesc_2_4::XercesDOMParser::Val_Never);
// optional.

parser->setDoNamespaces(false);    // optional

 

xercesc_2_4::ErrorHandler* errHandler = (xercesc_2_4::ErrorHandler*) new
xercesc_2_4::HandlerBase();

parser->setErrorHandler(errHandler);

 

string metaDataFile = GetMetadataFileName(submissionID);

 

try 

{

      // leak seems to occur here

      parser->parse(metaDataFile.c_str());

}

 

catch (const xercesc_2_4::XMLException& toCatch) 

{

      char* message =
xercesc_2_4::XMLString::transcode(toCatch.getMessage());

      std::cout << "Exception message is: \n" << message << "\n";

      xercesc_2_4::XMLString::release(&message);

}

 

catch (const xercesc_2_4::DOMException& toCatch) 

{

      char* message = xercesc_2_4::XMLString::transcode(toCatch.msg);

      std::cout << "Exception message is: \n" << message << "\n";

      xercesc_2_4::XMLString::release(&message);

}

 

catch (...) 

{

      std::cout << "Unexpected Exception \n";

}

 

xercesc_2_4::DOMDocument* xmlDoc = parser->getDocument();

      

if( NULL == xmlDoc )

{

      std::cout<<"xml doc is null, quit\n";

}

 

xercesc_2_4::DOMNode* docNode = xmlDoc->getDocumentElement();

      

if( NULL == docNode )

{

      std::cout<<"doc is null, quit\n";

}

 

xercesc::DOMNodeList* list;

xercesc::DOMNode* node;

const XMLCh* n;

char* xmlval = "";

string szXmlVal = "";

 

 

list = xmlDoc->getElementsByTagName( XMLString::transcode(szTag.c_str())
);

node = list->item(0);

if( xercesc::DOMNode::ELEMENT_NODE == node->getNodeType() )

{

      n = node->getFirstChild()->getNodeValue();

      xmlval = xercesc_2_4::XMLString::transcode(n);

      szXmlVal = xmlval;

      xercesc_2_4::XMLString::release(&xmlval);       

}

 

//node->release();

//parser->resetDocumentPool();

delete parser;

delete [] xmlval;

delete errHandler;

return szXmlVal;

 

}

 

 

Can anyone help me remove this leak. It is running in a service and is
called every few seconds, so the leak gets quite large quickly.

 

Enda

 

________________________

Enda Mannion

 


Re: Xerces Dom parser memory leak

Posted by Alberto Massari <am...@datadirect.com>.
Hi Enda,
could you test your code against the latest 2.7 version? This way we 
can see if was an old (fixed) bug.

Thanks,
Alberto

At 10.54 16/12/2005 +0000, Mannion, Enda wrote:
>Hi,
>
>The following code causes a 400K leak each time it is called. It 
>seems to occue in the following line: parser->parse(metaDataFile.c_str());
>
>Has anyone had any similar parse leak issues or does this code look 
>file to you. Also could this code be improved in any way, I very new 
>to this xerces development.
>
>
>String function()
>{
>
>xercesc_2_4::XercesDOMParser* parser = new xercesc_2_4::XercesDOMParser();
>if(parser == NULL)
>{
>       return "";
>}
>
>parser->setValidationScheme(xercesc_2_4::XercesDOMParser::Val_Never); 
>// optional.
>parser->setDoNamespaces(false);    // optional
>
>xercesc_2_4::ErrorHandler* errHandler = (xercesc_2_4::ErrorHandler*) 
>new xercesc_2_4::HandlerBase();
>parser->setErrorHandler(errHandler);
>
>string metaDataFile = GetMetadataFileName(submissionID);
>
>try
>{
>       // leak seems to occur here
>       parser->parse(metaDataFile.c_str());
>}
>
>catch (const xercesc_2_4::XMLException& toCatch)
>{
>       char* message = 
> xercesc_2_4::XMLString::transcode(toCatch.getMessage());
>       std::cout << "Exception message is: \n" << message << "\n";
>       xercesc_2_4::XMLString::release(&message);
>}
>
>catch (const xercesc_2_4::DOMException& toCatch)
>{
>       char* message = xercesc_2_4::XMLString::transcode(toCatch.msg);
>       std::cout << "Exception message is: \n" << message << "\n";
>       xercesc_2_4::XMLString::release(&message);
>}
>
>catch (...)
>{
>       std::cout << "Unexpected Exception \n";
>}
>
>xercesc_2_4::DOMDocument* xmlDoc = parser->getDocument();
>
>if( NULL == xmlDoc )
>{
>       std::cout<<"xml doc is null, quit\n";
>}
>
>xercesc_2_4::DOMNode* docNode = xmlDoc->getDocumentElement();
>
>if( NULL == docNode )
>{
>       std::cout<<"doc is null, quit\n";
>}
>
>xercesc::DOMNodeList* list;
>xercesc::DOMNode* node;
>const XMLCh* n;
>char* xmlval = "";
>string szXmlVal = "";
>
>
>list = xmlDoc->getElementsByTagName( XMLString::transcode(szTag.c_str()) );
>node = list->item(0);
>if( xercesc::DOMNode::ELEMENT_NODE == node->getNodeType() )
>{
>       n = node->getFirstChild()->getNodeValue();
>       xmlval = xercesc_2_4::XMLString::transcode(n);
>       szXmlVal = xmlval;
>       xercesc_2_4::XMLString::release(&xmlval);
>}
>
>//node->release();
>//parser->resetDocumentPool();
>delete parser;
>delete [] xmlval;
>delete errHandler;
>return szXmlVal;
>
>}
>
>
>Can anyone help me remove this leak. It is running in a service and 
>is called every few seconds, so the leak gets quite large quickly.
>
>Enda
>
>________________________
>Enda Mannion
>



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