Forum Programmation.c++ Xerces C++ - Fuite mémoire

Posté par  .
Étiquettes : aucune
0
12
oct.
2005
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
#else
#include <iostream.h>
#endif

XERCES_CPP_NAMESPACE_USE


int main(int argC, char* argV[])
{

    try

{
XMLPlatformUtils::Initialize();
}

catch(const XMLException& toCatch)
{
return 1;
}

// Watch for special case help request
int errorCode = 0;
if (argC > 1)
{
errorCode = 1;
}
if(errorCode) {
XMLPlatformUtils::Terminate();
return errorCode;
}

{


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)
{
errorCode = 2;
}
catch (...)
{
errorCode = 3;
}
} // (inpl != NULL)
else
{
errorCode = 4;
}
}

XMLPlatformUtils::Terminate();
return errorCode;
}
  • # Liberation après transcode ?

    Posté par  (site web personnel) . Évalué à 2.

    Je ne suis pas expert Xerces. Dans les utilisations qu'on en fait, voici comment nous manipulons les chaines :

    std::string NomElement;
    ...
    XMLCh * nomElement = XMLString::transcode(NomElement.c_str());
    ...
    XMLString::release(&nomElement);


    Je connais pas la forme que tu utilises.


    Sinon, si tu a la possibilité de compiler/tester sur Linux sur PC, y'a valgrind qui peut t'aider à trouver l'origine du problème.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.