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 Bonnefille Guilhem (site web personnel) . Évalué à 2.
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.