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 radada <pa...@yahoo.fr> on 2009/04/21 10:10:03 UTC

Xerces 3.0.1 C++ memory leak

Hi there,

for my job, an XML parser was implemented using xerces 2.4 (AIX 5.1), mais
we always had a memory leak.
Considering the complexity of the code, I tried to redesign a simple XML
parser using the 3.0.1. xerces version.
I reused a sample code from the xerces site "Dom programming guide" (-->
http://xerces.apache.org/xerces-c/program-dom-3.htm)
Here is my code (well, a part of it)

void bJTOTest::Traiter()
{
   XMLPlatformUtils::Initialize();
   for (int i = 0; i < 500; i++)
      creerFichierXML(i);
}

void bJTOTest::creerFichierXML(int p_iIndex)
{
   cout << "Traitement du fichier " << p_iIndex << endl;
   char tc_pid[10];
   cout << "MEMORY BEFORE" << endl;
   sprintf(tc_pid,"ps v %d", getpid());
   system(tc_pid);

   char l_tcFilePath[50+1];
   memset(l_tcFilePath, '\0', sizeof(l_tcFilePath));
   sprintf(l_tcFilePath, "XML/Test%d.xml", p_iIndex);

   // Doc XML
   DOMDocument* myDoc = NULL;
   XMLCh tempStr[100];
   //XMLString::transcode("LS", tempStr, 99);
   DOMImplementation *impl =
DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("LS"));
   // create the document
   myDoc = impl->createDocument();

   cout << "    Création du noeud ID" << endl;
   DOMElement* firstChild;
   firstChild = myDoc->createElement(XMLString::transcode("array-list"));
   cout << "      appending the root node" << endl;
   myDoc->appendChild(firstChild);

   // XML Tree
   for (int i=0; i<30; i++)
   {
      char* l_pcMessage = NULL;
      try
      {
         cout << "New Indentity" << endl;

         cout << "    Création du noeud ID" << endl;
         DOMElement* firstChild;
         firstChild =
myDoc->createElement(XMLString::transcode("Indentity"));

            cout << "      Name" << endl;
            DOMElement* secondChild;
            secondChild =
myDoc->createElement(XMLString::transcode("Name"));
            DOMText* secondTextNode;
            secondTextNode =
myDoc->createTextNode(XMLString::transcode("WAZA"));
            secondChild->appendChild(secondTextNode);
            firstChild->appendChild(secondChild);

            cout << "      Firstname" << endl;
            DOMElement* thirdChild;
            thirdChild =
myDoc->createElement(XMLString::transcode("Firstname"));
            DOMText* thirdTextNode;
            thirdTextNode =
myDoc->createTextNode(XMLString::transcode("WAZA"));
            thirdChild->appendChild(thirdTextNode);
            firstChild->appendChild(thirdChild);

            cout << "      Gender" << endl;
            DOMElement* fourthChild;
            fourthChild =
myDoc->createElement(XMLString::transcode("Gender"));
            DOMText* fourthTextNode;
            fourthTextNode =
myDoc->createTextNode(XMLString::transcode("MALE"));
            fourthChild->appendChild(fourthTextNode);
            firstChild->appendChild(fourthChild);

         cout << "      appending the node in the tree" << endl;
         myDoc->getDocumentElement()->appendChild(firstChild);
      }
      catch(XMLException& XMLEx)
      {
         l_pcMessage = XMLString::transcode(XMLEx.getMessage());
         cout << "XMLException <" << l_pcMessage << endl;
         XMLString::release(&l_pcMessage);
      }
      catch(DOMException& DOMEx)
      {
         l_pcMessage = XMLString::transcode(DOMEx.msg);
         cout <<  "DOMException <" << l_pcMessage << "> code <" <<
DOMEx.code << ">" << endl;
         XMLString::release(&l_pcMessage);
      }
      catch(SAXException& SaxEx)
      {
         l_pcMessage = XMLString::transcode(SaxEx.getMessage());
         cout <<  "SAXException <" << l_pcMessage << endl;
         XMLString::release(&l_pcMessage);
      }
      catch(...)
      {
         cout << "OtherException <" << endl;
      }
   }

   cout << "Serialisation..." << endl;
   serializeDOM(myDoc, l_tcFilePath);

   cout << "MEMORY AFTERE" << endl;
   sprintf(tc_pid,"ps v %d", getpid());
   system(tc_pid);

   // on a fini avec le domcument, on libère la mémoire
   release(myDoc);
}

void bJTOTest::release(DOMDocument* myDoc)
{
   cout << "release" << endl;
   myDoc->release();
}

int bJTOTest::serializeDOM(DOMNode* node, char* path)
{
   XMLCh tempStr[100];
   XMLString::transcode("LS", tempStr, 99);
   DOMImplementation *impl =
DOMImplementationRegistry::getDOMImplementation(tempStr);
   DOMLSSerializer* theSerializer =
((DOMImplementationLS*)impl)->createLSSerializer();

   DOMLSOutput* theOutput = ((DOMImplementationLS*)impl)->createLSOutput();

   try
   {
      theSerializer->writeToURI(node, XMLString::transcode(path));
   }
   catch (const XMLException& toCatch)
   {
      char* message = XMLString::transcode(toCatch.getMessage());
      cout << "Exception message is: \n"
      << message << "\n";
      XMLString::release(&message);
      return -1;
   }
   catch (const DOMException& toCatch)
   {
      char* message = XMLString::transcode(toCatch.msg);
      cout << "Exception message is: \n"
      << message << "\n";
      XMLString::release(&message);
      return -1;
   }
   catch (...)
   {
      cout << "Unexpected Exception \n" ;
      return -1;
   }

   theOutput->release();
   theSerializer->release();
   return 0;
}

I release the serializer, the DOMLSOutput and the DOMDocument.
It says on the xerces Dom programming guide page, I quote :
"When a DOMDocument is released, all its associated children AND any objects
it owned (e.g. DOMRange, DOMTreeWalker, DOMNodeIterator or any orphaned
nodes) will also be released."
which I understand as : release a DOMDocumet and all its associated children
will also be release, right?

Nevertheless, I still have a memory leak, and I can't figure what am I doing
wrong...

Thx for your help : )
-- 
View this message in context: http://www.nabble.com/Xerces-3.0.1-C%2B%2B-memory-leak-tp23151106p23151106.html
Sent from the Xerces - C - Dev mailing list archive at Nabble.com.


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


Re: Xerces 3.0.1 C++ memory leak

Posted by radada <pa...@yahoo.fr>.
It actually did work!! Thanks a lot Alberto.
I just don't understand why it did not work the first time, but the result's
here : )
Thanks again!!!


radada wrote:
> 
> Hi and thx for your answer.
> Since the transcode uses a shared memory, do I have to call a release each
> time I call a transcode?
> FYI I did try this (callin a release for each transcode) in the orginal
> program, but it didn't work.
> I'll give it a try with this code and post the result here.
> Thanks again : )
> 
> 
> Alberto Massari wrote:
>> 
>> Hi,
>> you are not releasing a lot of XMLString::transcode calls.
>> 
>> Alberto
>> 
>> radada wrote:
>>> Hi there,
>>>
>>> for my job, an XML parser was implemented using xerces 2.4 (AIX 5.1),
>>> mais
>>> we always had a memory leak.
>>> Considering the complexity of the code, I tried to redesign a simple XML
>>> parser using the 3.0.1. xerces version.
>>> I reused a sample code from the xerces site "Dom programming guide" (-->
>>> http://xerces.apache.org/xerces-c/program-dom-3.htm)
>>> Here is my code (well, a part of it)
>>> [..]
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
>> For additional commands, e-mail: c-dev-help@xerces.apache.org
>> 
>> 
>> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Xerces-3.0.1-C%2B%2B-memory-leak-tp23151106p23152823.html
Sent from the Xerces - C - Dev mailing list archive at Nabble.com.


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


Re: Xerces 3.0.1 C++ memory leak

Posted by radada <pa...@yahoo.fr>.
Hi and thx for your answer.
Since the transcode uses a shared memory, do I have to call a release each
time I call a transcode?
FYI I did try this (callin a release for each transcode) in the orginal
program, but it didn't work.
I'll give it a try with this code and post the result here.
Thanks again : )


Alberto Massari wrote:
> 
> Hi,
> you are not releasing a lot of XMLString::transcode calls.
> 
> Alberto
> 
> radada wrote:
>> Hi there,
>>
>> for my job, an XML parser was implemented using xerces 2.4 (AIX 5.1),
>> mais
>> we always had a memory leak.
>> Considering the complexity of the code, I tried to redesign a simple XML
>> parser using the 3.0.1. xerces version.
>> I reused a sample code from the xerces site "Dom programming guide" (-->
>> http://xerces.apache.org/xerces-c/program-dom-3.htm)
>> Here is my code (well, a part of it)
>> [..]
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: c-dev-unsubscribe@xerces.apache.org
> For additional commands, e-mail: c-dev-help@xerces.apache.org
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Xerces-3.0.1-C%2B%2B-memory-leak-tp23151106p23152637.html
Sent from the Xerces - C - Dev mailing list archive at Nabble.com.


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


Re: Xerces 3.0.1 C++ memory leak

Posted by Alberto Massari <am...@datadirect.com>.
Hi,
you are not releasing a lot of XMLString::transcode calls.

Alberto

radada wrote:
> Hi there,
>
> for my job, an XML parser was implemented using xerces 2.4 (AIX 5.1), mais
> we always had a memory leak.
> Considering the complexity of the code, I tried to redesign a simple XML
> parser using the 3.0.1. xerces version.
> I reused a sample code from the xerces site "Dom programming guide" (-->
> http://xerces.apache.org/xerces-c/program-dom-3.htm)
> Here is my code (well, a part of it)
> [..]


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