gsoap segfaults мое приложение (написанное на C) при каждом втором вызове

0

Мой вызывающий клиент 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, может возникнуть проблема с утечкой памяти.

  • 0
    soap_end и soap_free звучат как вызовы, которые лишают законной силы указатель, созданный вами с помощью soap_new в начале, и soap_new звучит так, как будто вы повторно используете этот указатель после вызова soap_end / soap_free . soap_end / soap_free тогда, когда вы закончили с объектом, созданным soap_new .
  • 0
    Уважаемый Кайл, в каждом цикле каждый раз, когда вызывается поток, мыльный объект повторно инициализируется с помощью soap_new. Мыло "soap_end" и "soap_free" вызываются только при отсутствии необходимости в объекте "мыло".
Теги:
struct
soap
web-services

1 ответ

0

Разумеется, вам поможет контролер памяти, такой как 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню