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