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 :
le main :
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); [...] }
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.
Partager