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.