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