Xerces C++ - Fuite de mémoire

Xerces C++ - Fuite de mémoire - C++ - Programmation

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;
}

Reply

Marsh Posté le 13-10-2005 à 10:23:27   

Reply

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..

Reply

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 !

Reply

Marsh Posté le 14-10-2005 à 16:33:07    

je me disais bien..

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed