Xerces C++ - Fuite de mémoire - C++ - Programmation
Marsh Posté le 14-10-2005 à 11:43:04
j'ai déjà eu ce type de problème avec xerces sur socle hp
mais je n'ai pas trouvé de solution..
Marsh Posté le 14-10-2005 à 15:15:33
Salut,
voir http://issues.apache.org/bugzilla/ [...] i?id=24173
Je ne crois pas qu'il y a une solution !
Marsh Posté le 13-10-2005 à 10:23:27
Dans une application C++, en utilisant le parser XML Xerces v2.5, je rencontre un problème de fuite de mémoire sous HP-UX11.0
L'arbre XML créé en mémoire est correct, cependant la libération des ressources ne semble pas etre gérée correctement quand cet
arbre est reconstruit périodiquement. La commande "top" remonte une augmentation constante de la mémoire occupée par le process.
Voici le code représentant le problème. Merci de vos réponses :
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/dom/DOM.hpp>
#if defined(XERCES_NEW_IOSTREAMS)
#include <iostream>
#else
#include <iostream.h>
#endif
XERCES_CPP_NAMESPACE_USE
// main
// ---------------------------------------------------------------------------
int main(int argC, char* argV[])
{
// Initialize the XML4C2 system.
try
{
XMLPlatformUtils::Initialize();
}
catch(const XMLException& toCatch)
{
char *pMsg = XMLString::transcode(toCatch.getMessage());
XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n"
<< " Exception message:"
<< pMsg;
XMLString::release(&pMsg);
return 1;
}
// Watch for special case help request
int errorCode = 0;
if (argC > 1)
{
XERCES_STD_QUALIFIER cout << "\nUsage:\n"
" CreateDOMDocument\n\n"
"This program creates a new DOM document from scratch in memory.\n"
<< XERCES_STD_QUALIFIER endl;
errorCode = 1;
}
if(errorCode) {
XMLPlatformUtils::Terminate();
return errorCode;
}
{
// Nest entire test in an inner block.
// The tree we create below is the same that the XercesDOMParser would
// have created, except that no whitespace text nodes would be created.
// <ROOT>
// <FILS1>TEXTE-FILS-1</FILS1>
// <FILS2>
// <FILS20>TEXTE-FILS-2-0</FILS20>
// <FILS21>TEXTE-FILS-2-1</FILS21>
// .........jusqu'à 1000 fils.....
// <FILS2999>TEXTE-FILS-2-1000</FILS21000>
// </FILS2>
//
// </ROOT>
XMLCh tempStr[100];
XMLString::transcode("Core", tempStr, 99);
DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr);
if (impl != NULL)
{
int i = 0;
char fils[50];
char texteFils[50];
try
{
XMLString::transcode("ROOT", tempStr, 99);
DOMDocument* doc = impl->createDocument(0, tempStr, 0);
DOMElement* rootElem = doc->getDocumentElement();
DOMElement* tabDOMElement[1000];
DOMText* tabDOMText[1000];
while (true){
XMLString::transcode("FILS1", tempStr, 99);
DOMElement* fils1Elem = doc->createElement(tempStr);
rootElem->appendChild(fils1Elem);
XMLString::transcode("TEXTE-FILS-1", tempStr, 99);
DOMText* fils1Texte = doc->createTextNode(tempStr);
fils1Elem->appendChild(fils1Texte);
XMLString::transcode("FILS2", tempStr, 99);
DOMElement* fils2Elem = doc->createElement(tempStr);
rootElem->appendChild(fils2Elem);
for (i=0; i<1000; i++){
memset(fils,'\0',50);
memset(texteFils,'\0',50);
sprintf(fils, "FILS2%d", i);
sprintf(texteFils, "TEXTE-FILS-2-%d", i);
XMLString::transcode(fils, tempStr, 99);
tabDOMElement[i] = doc->createElement(tempStr);
XMLString::transcode(texteFils, tempStr, 99);
tabDOMText[i] = doc->createTextNode(tempStr);
fils2Elem->appendChild(tabDOMElement[i]);
tabDOMElement[i]->appendChild(tabDOMText[i]);
}
//LIBERATION DE "FILS1" et "FILS2"
rootElem->removeChild(fils1Elem);
fils1Elem->release();
rootElem->removeChild(fils2Elem);
fils2Elem->release();
}//FIN DU WHILE
doc->release();
}
catch (const DOMException& e)
{
XERCES_STD_QUALIFIER cerr << "DOMException code is: " << e.code << XERCES_STD_QUALIFIER endl;
errorCode = 2;
}
catch (...)
{
XERCES_STD_QUALIFIER cerr << "An error occurred creating the document" << XERCES_STD_QUALIFIER endl;
errorCode = 3;
}
} // (inpl != NULL)
else
{
XERCES_STD_QUALIFIER cerr << "Requested implementation is not supported" << XERCES_STD_QUALIFIER endl;
errorCode = 4;
}
}
XMLPlatformUtils::Terminate();
return errorCode;
}