begin process at 2012 02 13 05:36:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Base de données

 > 

XML

 > 

Memory Leak Xerces 3.0.1. C++ (AIX 5.1)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Memory Leak Xerces 3.0.1. C++ (AIX 5.1)

mardi 21 avril 2009 à 10:40:51 | Memory Leak Xerces 3.0.1. C++ (AIX 5.1)

radada

Bonjour à tous,

pour mon taf, un parserXML a été implémenté avec Xerces 2.4, mais nous avons toujours eu une fuite mémoire (sur serveur AIX5.1).

J'ai donc repris la dernière version de xerces (3.0.1), recompilé sur AIX 5.1 et fais ce petit bout de code tout con. Il crée des fichiers XML en boucle avec dans les fichiers XML, une répétition de balises.
J'ai récupérer une partie du code du site de xerces (Dom programming guide --> http://xerces.apache.org/xerces-c/program-dom-3.htm)

Voici le code :
Code :

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 << "Conso MEMOIRE AV DEMANDE" << 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"));
   // on crée le doc
   myDoc = impl->createDocument();

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

   // création des Noeuds
   // Premier Node : Individu
   for (int i=0; i<30; i++)
   {
      char* l_pcMessage = NULL;
      try
      {
         cout << "Insertion d'une nouvelle entite ID" << endl;

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

            cout << "      Création du NOM" << endl;
            DOMElement* secondChild;
            secondChild = myDoc->createElement(XMLString::transcode("Nom"));
            DOMText* secondTextNode;
            secondTextNode = myDoc->createTextNode(XMLString::transcode("WAZA"));
            secondChild->appendChild(secondTextNode);
            firstChild->appendChild(secondChild);

            cout << "      Création du PRENOM" << endl;
            DOMElement* thirdChild;
            thirdChild = myDoc->createElement(XMLString::transcode("Prenom"));
            DOMText* thirdTextNode;
            thirdTextNode = myDoc->createTextNode(XMLString::transcode("WAZA"));
            thirdChild->appendChild(thirdTextNode);
            firstChild->appendChild(thirdChild);

            cout << "      Création du SEXE" << endl;
            DOMElement* fourthChild;
            fourthChild = myDoc->createElement(XMLString::transcode("Sexe"));
            DOMText* fourthTextNode;
            fourthTextNode = myDoc->createTextNode(XMLString::transcode("HOMME"));
            fourthChild->appendChild(fourthTextNode);
            firstChild->appendChild(fourthChild);

         cout << "      Ajout du noeud dans le doc" << 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 << "Conso MEMOIRE APS DEMANDE" << 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;
}
Je release bien le serializer et le DOMLSOutput ainsi que le DOMDocument. Il est en effet indiqué dans la doc que, je cite :
Citation:
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.
ce que je comprend par : releasez le DOMDocument et tous les noeuds fils seront à leur tour releasés non?

Quoiqu'il en soit, j'ai toujours une fuite mémoire puisque la conso du serveur (visualisée grace au 'ps') ne descend jamais..

Si vous avez des idées, je suis complètement coincé là...

Merci : )


Cette discussion est classée dans : cout, xerces, appendchild, xmlstring, transcode


Répondre à ce message

Sujets en rapport avec ce message

randomize [ par niconico ] salut à tous, je débute en C++ et j'utilise VC++ pour compiler mes prog :le prob :avec ce petit programe (plus bas)il me sort 2 erreurs :error C2065: Probleme [ par vb7 ] J'ai un probleme!!!l instruction if et else ne fonctionne pas!! voilà mon code :#include void main(){char A[1000];coutcin>>A;if (A>"teste"){cout<<"tes Comment mettre de la couleur dans un cout? [ par Samoul ] Je voudrait mettre de la couleur bien changer la couleur du texte de mon cout! C'est pas vraiment compliqué mais je voudrait savoir comment si ca se f Pas compris les arguments [ par Bog ] Bonjour.Voila à chaque fois que je me lance dans un projet de programmation C++, je suis tjrs bloqué par certaines choses, surtout les arguments, et c Pas compris les arguments [ par Bog ] Bonjour.Voila à chaque fois que je me lance dans un projet de programmation C++, je suis tjrs bloqué par certaines choses, surtout les arguments, et c Désolé Jo [ par Mickylord ] de t'embeter avec mes questions stupides et idiotes mais que je n'arive pas a comprendre . Je debute en C++ , je sais que tu est tres fort et , en che fprintf de factorielles ! [ par Xs ] voila, je comprend pas pourquoi le prog me met une erreur lors de l'execution alors que le compilateur et le linker n'ont rien vu d'anormal !#include Dans le genre prenant........ [ par Xs ] oui !c 'est trés chiant !j'explique mon pb : j'ai un code source, fais par moi-meme, et dedans, je veux que l'on saisisse des renseignement comme le l implicit declaration of function `int getchar(...)' [ par cognac ] À chaque fois que j'utilise getch(); j'obtien le message suivant:getch();Voici mon programme (en fait mon exercice):#include //bibliotheque d'entree Sortie couleru avec cout [ par bouba ] D'habitude je programme en C avec cprintf pour faire des sorties en cou leurs y'a pas de problème (textcolor etc...). Mais récemment je me suis mis a


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,232 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales