2010-08-10 7 views
2

J'ai lu les docs gSOAP et vu des mentions du fait que l'on devrait appeler soap_destroy (soap) et soap_end (soap) etc, cependant ce sont toujours des exemples avec un seul appel sur l'objet service. Le service que j'utilise renvoie environ 40 Ko de texte à chaque invocation. Mon problème est que l'utilisation de la mémoire augmente linéairement d'environ la même taille pour chaque demande. J'ai ajouté soap_destroy (service-> savon) dans getWords en vain. Quelqu'un peut-il indiquer quel code de nettoyage manque dans cet extrait de code? Le programme demandeur doit être en cours d'exécution pendant plusieurs jours, donc par nettoyage de la demande est ce qui me préoccupe plutôt qu'à l'arrêt.gSOAP fuite de mémoire du client C++

J'ai posté ci-dessous un exemple analogue (sans vérification d'erreur) basé sur http://www.webservicex.net/WCF/ServiceDetails.aspx?SID=43, (renvoie des blocs de texte à droite?). Toute aide est grandement appréciée!

#include "soapBibleWebserviceSoapProxy.h" 
#include "BibleWebserviceSoap.nsmap" 
#include <iostream> 
extern "C" { 
#include <unistd.h> 
} 

struct Service 
{ 
    BibleWebserviceSoap service; 

    std::string getWords(std::string &title, int chapter) 
    { 
     _ns1__GetBibleWordsByBookTitleAndChapter req; 
     _ns1__GetBibleWordsByBookTitleAndChapterResponse resp; 
     req.BookTitle = &title; 
     req.chapter = 1; 

     service.__ns2__GetBibleWordsByBookTitleAndChapter(&req, &resp); 

     return *(resp.GetBibleWordsByBookTitleAndChapterResult); 
    } 
}; 

int main(int argc, char* argv[]) 
{ 
    Service s; 
    std::string genesis("Genesis"); 
    for (int i=0; i<360; ++i) 
    { 
     sleep(2); 
     std::cout << s.getWords(genesis,1) << std::endl; 
    } 
    return 0; 
} 

Répondre

0

Exécutez votre application sous Valgrind (valgrind.org - généralement installé par défaut sur Linux) - c'est la meilleure façon de traquer les fuites de mémoire.

Effectuez plus de 1 000 appels et lors de l'arrêt, vous verrez la fuite. Si la fuite n'est pas affichée à l'arrêt, alors une liste ou une carte recueille des entrées mais ne les libère qu'à l'arrêt - dans ce cas, utilisez Massif (une partie de Valgrind) - c'est aussi un outil génial.

Ce n'est pas une réponse directe, mais une trace de pile de l'allocation qui mange de la mémoire aide généralement beaucoup à identifier une raison d'une fuite.