IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Gestion de la mémoire Gsoap


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Points : 13
    Points
    13
    Par défaut Gestion de la mémoire Gsoap
    Bonjour,

    Je développe un serveur webservice en C++ sous Visual C++ 6. J'utilise gsoap 2.7.11.

    Le fichier WSDL est fourni par une tierce entreprise. Le but du webService est d'échanger une structure d'information composée de tableau de caractère de time_t etc ...

    Ces structures sont définies dans des classes, les variables membres des ces classes sont des pointeurs pointant vers les différents éléments. Ces pointeurs sont initialisés à NULL dans le constructeur. Tout ça dans du code généré par gSoap. auquel je ne peux, bien entendu, pas toucher.

    C'est donc dans la surcharge des fonctions de réponse que je vais allouer de la mémoire à ces pointeurs, grâce à soap_malloc(struct soap *soap, size_t)

    Cette mémoire est théoriquement libérée grâce à soap_destroy(struct soap* soap) après le soap_serve(...), sauf qu'à mon grand désespoir ce n'est pas le cas et j'espère que vous allez pouvoir m'aider à trouver pourquoi !



    Un peu de code :

    la fonction appelé pour répondre à la requette soap :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int __ns1__cardProductEnquiry(
    	struct soap *soap, 
    	ns2__CardEnquiry*  ns1__cardEnquiry, // request parameters:
    	ns2__CardInfoType*   ns1__cardEnquiryResponse // response parameters: )
    {
    if(ProductInfoGetValues(ns1__cardEnquiryResponse,ns1__cardEnquiry->cardId,0, soap))
      return SOAP_FAULT;
    else
      return SOAP_OK;
    }

    la fonction ProductInfoGetValues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int CardInfoGetValues(ns2__CardInfoType * l_cardEnquiryResponse,__int64 id, __int64 tagId,struct soap* soap)
    {
    [...]
    //Les malloc
    l_cardEnquiryResponse->cardid = (char **)soap_malloc(soap,sizeof(char*));
    *l_cardEnquiryResponse->cardId = (char *)soap_malloc(soap,5);
    strncpy(*l_cardEnquiryResponse->cardRetailerId, "Hello toto",5);
    [...]
    }
    le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    int main(int argc, char *argv[]) 
    {
    	struct soap v_soap; // contexte du service SOAP
    	// on initialise la socket
    	soap_init( &v_soap );
    	if (soap_bind(&v_soap,NULL,8060,100) < 0) { return -1; }	
    	while(true)
    	{
    		v_soap.accept_timeout = 1;
    		if(soap_accept(&v_soap)<0){continue;}
    		soap_serve(&v_soap);
    		soap_destroy(&v_soap);
    //Libération de la mémoire que je soupçonne de ne pas fonctionner 
    		soap_end( &v_soap );		
    	}
    	soap_done( &v_soap );
     
     
    	return 0;
    }

    Pour faire ça j'ai suivi le très bon article de lionel tricon sur http://lionel.tricon.free.fr/ ainsi que la doc gSoap (malheureusement disponible qu'en anglais).

    Le graphe d'utilisation de mémoire de mon exécutable ressemble à une très belle droite x=y La mémoire monte cruellement est indéfiniment.



    Merci pour le temps que vous accorderez à mon topic.

  2. #2
    screetch
    Invité(e)
    Par défaut
    si tu appelles soap_malloc a mon avis il faut aussi appeler soap_free.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par screetch Voir le message
    si tu appelles soap_malloc a mon avis il faut aussi appeler soap_free.
    Je peux appeler soap_dealloc() effectivement pour libérer la mémoire. Sauf que ce n'est pas le fonctionnement qu'il me faut, cette fonction a besoin du pointeur de la zone mémoire à libérer.

    L'objet contenant la structure de la réponse est utilisé après la sortie de la fonction où j'alloue de la mémoire et je renseigne les valeurs des champs. Soap va le sérialiser pour l'envoyer sur le réseaux. Je n'aurais donc plus la main sur les différents pointeurs à "désalouer" (ce mot n'est certainement pas français ).

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Je rajoute une question à mon sujet : Quel est le moyen le plus efficace de vérifier l'espace mémoire que consomme mon application et le moyen d'identifier l'origine de ma fuite mémoire ?

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  2. gestion de la mémoire
    Par moldavi dans le forum C++
    Réponses: 17
    Dernier message: 04/02/2005, 23h18
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo