Hi,
Thanks for getting back to me, I have implemented the changes you
suggested and I still get a leak of 24K each time the function is
called.
Anything else I can do to free up memory in this function.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\
{
xercesc::XercesDOMParser* parser = new
xercesc::XercesDOMParser();
if(parser == NULL)
{
return "";
}
parser->setValidationScheme(xercesc::XercesDOMParser::Val_Never); //
optional.
parser->setDoNamespaces(false); // optional
xercesc::ErrorHandler* errHandler = (xercesc::ErrorHandler*) new
xercesc::HandlerBase();
parser->setErrorHandler(errHandler);
string metaDataFile = GetMetadataFileName(submissionID);
try
{
// path to metadata file
parser->parse(metaDataFile.c_str());
}
catch (const xercesc::XMLException& toCatch)
{
char* message =
xercesc::XMLString::transcode(toCatch.getMessage());
std::cout << "Exception message is: \n" << message <<
"\n";
LOGERROR("Exception message is: " << message);
xercesc::XMLString::release(&message);
delete parser;
delete errHandler;
return "";
}
catch (const xercesc::DOMException& toCatch)
{
char* message =
xercesc::XMLString::transcode(toCatch.msg);
std::cout << "Exception message is: \n" << message <<
"\n";
LOGERROR("Exception message is: " << message);
xercesc::XMLString::release(&message);
delete parser;
delete errHandler;
return "";
}
catch (...)
{
std::cout << "Unexpected Exception \n";
LOGERROR("Metadata::ReadMetaDataState xercesc (...)
Exception");
delete parser;
delete errHandler;
return "";
}
xercesc::DOMDocument* xmlDoc = parser->getDocument();
if( NULL == xmlDoc )
{
std::cout<<"xml doc is null, quit\n";
delete parser;
delete errHandler;
return "";
}
xercesc::DOMNode* docNode = xmlDoc->getDocumentElement();
if( NULL == docNode )
{
std::cout<<"doc is null, quit\n";
delete parser;
delete errHandler;
return "";
}
xercesc::DOMNodeList* list;
xercesc::DOMNode* node;
const XMLCh* n;
char* xmlval = "";
string szXmlVal = "";
// <em> ToDo check if it reads the ints
//list = xmlDoc->getElementsByTagName(
XMLString::transcode(szTag.c_str()) );
XMLCh* tag=XMLString::transcode(szTag.c_str());
list = xmlDoc->getElementsByTagName( tag );
XMLString::release(&tag);
node = list->item(0);
if( xercesc::DOMNode::ELEMENT_NODE == node->getNodeType() )
{
n = node->getFirstChild()->getNodeValue();
xmlval = xercesc::XMLString::transcode(n);
szXmlVal = xmlval;
}
xercesc::XMLString::release(&xmlval);
delete parser;
delete errHandler;
return szXmlVal;
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\
-----Original Message-----
From: Alberto Massari [mailto:[EMAIL PROTECTED]
Sent: 01 June 2006 12:15
To: [email protected]
Subject: Re: Memory leak in DOM Parser
Hi Enda,
At 12:07 PM 6/1/2006 +0100, Mannion, Enda wrote:
>Hi I have a memory leak in this function, can anyone see where? Do I
>need to release const XMLCh* n; at the bottom, how do I do this.
>[...]
> 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::XMLString::transcode(n);
> szXmlVal = xmlval;
> xercesc::XMLString::release(&xmlval);
> xercesc::XMLString::release(n);
> }
>
>
> delete parser;
> delete [] xmlval;
> delete errHandler;
> return szXmlVal;
- you don't need to call xercesc::XMLString::release(n) as the node
value is owned by the DOMNode;
- you don't need to call delete [] xmlval as you already released it
using xercesc::XMLString::release(&xmlval)
- what you need to do is to release the argument of getElementsByTagName
e.g.
XMLCh* tag=XMLString::transcode(szTag.c_str());
list = xmlDoc->getElementsByTagName( tag );
XMLString::release(&tag);
Alberto
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]