I think the memory leak has gone away in that function.

Here is a function that instead of parsing the data it writes the data
and there seems be another leak here.

If you could give the code a quick glance and see if I am doing things
correctly I would be very grateful.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        try
        {
                DOMElement* SubmissionIDNode =
mDoc->createElement(DOMStr("submissionID"));
                DOMText* SubmissionIDText =
mDoc->createTextNode(DOMStr(m_submissionID.c_str()));
                SubmissionIDNode->appendChild(SubmissionIDText);
                m_serviceNode->appendChild(SubmissionIDNode);


                DOMElement* SubmissionDateNode =
mDoc->createElement(DOMStr("SubmissionDate"));
                DOMText* SubmissionDateText =
mDoc->createTextNode(DOMStr(currentDate.c_str()));
                SubmissionDateNode->appendChild(SubmissionDateText);
                m_serviceNode->appendChild(SubmissionDateNode);


                DOMElement* SubmissionTimeNode =
mDoc->createElement(DOMStr("SubmissionTime"));
                DOMText* SubmissionTimeText =
mDoc->createTextNode(DOMStr(currentTime.c_str()));
                SubmissionTimeNode->appendChild(SubmissionTimeText);
                m_serviceNode->appendChild(SubmissionTimeNode);


                DOMElement* currentStateNode =
mDoc->createElement(DOMStr("currentState"));
                DOMText* currentStateText =
mDoc->createTextNode(DOMStr(m_currentState.c_str()));
                currentStateNode->appendChild(currentStateText);
                m_serviceNode->appendChild(currentStateNode);

                DOMElement* numAttachmentsNode =
mDoc->createElement(DOMStr("numAttachments"));
                DOMText* numAttachmentsText =
mDoc->createTextNode(DOMStr(numAttachBuffer));
                numAttachmentsNode->appendChild(numAttachmentsText);
                m_serviceNode->appendChild(numAttachmentsNode);
        }

        catch (...)
        {
                std::cout << "Unexpected Exception \n";
                LOGERROR("Exception in WriteMetaDataXML writing XML
tags");
                return false;
        }


        //serialize the xml to a string
        XMLCh* unicodeStr = m_writer->writeToString(*m_serviceNode);
        char* theStr = xercesc::XMLString::transcode(unicodeStr);

        string metaDataFile = GetMetadataFileName(m_submissionID);
        ofstream metaFile(metaDataFile.c_str());
        metaFile<<theStr<<'\n';
        metaFile.close();


        xercesc::XMLString::release(&theStr);

////////////////////////////////////////////////////////////////////////
////

-----Original Message-----
From: Alberto Massari [mailto:[EMAIL PROTECTED] 
Sent: 01 June 2006 14:57
To: [email protected]
Subject: RE: Memory leak in DOM Parser

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]


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

Reply via email to