Hi Enda,

At 02:22 PM 6/1/2006 +0100, Mannion, Enda wrote:
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.

I don't see any clear memory leak; just for testing, replace your call to GetMetadataFileName(submissionID) with a constant file name, in order to exclude that the leaks comes from that code.

Alberto

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]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to