Мой вызывающий клиент gsoap получает segfaulted при каждом втором вызове soap_call___ns4__QueryAccBalIO
. В соответствии с документацией gsoap я выделяю память через soap_malloc и освобождаю ее с помощью soap_end, а soap_free также вызывается после каждого цикла ниже - часть кода, который я использую в своем клиентском Caller.
struct soap *soap = soap_new();
/**** Declaration of Client Structures ****/
struct _ns1__QUERYACCBAL_USCOREIOFS_USCOREREQ *QueryBal;
struct _ns1__QUERYACCBAL_USCOREIOFS_USCORERES *QueryRes;
struct _ns2__CREATETRANSACTION_USCOREIOPK_USCOREREQ *CreateTran;
struct _ns2__CREATETRANSACTION_USCOREIOPK_USCORERES *ResTran;
struct _ns2__REVERSETRANSACTION_USCOREIOPK_USCOREREQ *ReverseTran;
struct _ns2__REVERSETRANSACTION_USCOREIOPK_USCORERES *RevResTran;
if (!soap)
{
printf ("Exiting Thread.......");
return (void*) 0;
}
/**** Allocation ****/
QueryBal = (struct _ns1__QUERYACCBAL_USCOREIOFS_USCOREREQ *)soap_malloc(soap,sizeof(struct _ns1__QUERYACCBAL_USCOREIOFS_USCOREREQ));
QueryBal->FCUBS_USCOREHEADER=(struct ns1__FCUBS_USCOREHEADERType *)soap_malloc(soap,sizeof(struct ns1__FCUBS_USCOREHEADERType));
QueryBal->FCUBS_USCOREBODY.ACC_Balance=(struct ns1__Acc_Bal_Req_type *)soap_malloc(soap,sizeof(struct ns1__Acc_Bal_Req_type));
QueryRes = (struct _ns1__QUERYACCBAL_USCOREIOFS_USCORERES *)soap_malloc(soap,sizeof(struct _ns1__QUERYACCBAL_USCOREIOFS_USCORERES));
/**** Section of Assignment *****/
/**** Just right after Assignment Section gsoap Client Call ****/
rc = soap_call___ns4__QueryAccBalIO(soap,ReqResElements[a2->WS_ID].ConnectionString, NULL, QueryBal, QueryRes);
/**** Section Where soap_end() and soap_free() is being called *****/
if (rc)
{
// SOAP REQUEST REJECTED :(
printf("SOAP Request Rejected :( ");
soap_end(soap);
soap_free(soap);
printf("Exiting Thread.....");
return (void *) 0;
}
soap_end(soap);
soap_free(soap);
Теперь, согласно моему пониманию, он должен работать нормально, но когда мой клиент-клиент вызывает soap_call___ns4__QueryAccBalIO
первый раз, он получает успешный результат. Но во второй раз, когда мой клиент-звонитель называет одну и ту же функцию, он получает segfaulted.
Когда я удаляю soap_end (soap) и soap_free (soap) из моего кода, тогда это не segfault, Но, не вызывая soap_end и soap_free, может возникнуть проблема с утечкой памяти.
Разумеется, вам поможет контролер памяти, такой как valgrind.
Что мне кажется странным в вашем коде, то почему использование soap_malloc для аргументов запроса/ответа на распределение.
Ты пробовал:
_ns1__QUERYACCBAL_USCOREIOFS_USCOREREQ QueryBal;
QueryBal.FCUBS_USCOREHEADER=(struct ns1__FCUBS_USCOREHEADERType *)soap_malloc(soap,sizeof(struct ns1__FCUBS_USCOREHEADERType));
QueryBal.FCUBS_USCOREBODY.ACC_Balance=(struct ns1__Acc_Bal_Req_type *)soap_malloc(soap,sizeof(struct ns1__Acc_Bal_Req_type));
_ns1__QUERYACCBAL_USCOREIOFS_USCORERES QueryRes;
...
rc = soap_call___ns4__QueryAccBalIO(soap,ReqResElements[a2->WS_ID].ConnectionString, NULL, &QueryBal, &QueryRes);
soap_end
иsoap_free
звучат как вызовы, которые лишают законной силы указатель, созданный вами с помощьюsoap_new
в начале, иsoap_new
звучит так, как будто вы повторно используете этот указатель после вызоваsoap_end
/soap_free
.soap_end
/soap_free
тогда, когда вы закончили с объектом, созданнымsoap_new
.