gsoap 在我每第二次调用时都会对我的应用程序(用 C 编写)进行段错误

Posted

技术标签:

【中文标题】gsoap 在我每第二次调用时都会对我的应用程序(用 C 编写)进行段错误【英文标题】:gsoap segfaults my application (written in C) in every second time I call 【发布时间】:2013-12-18 19:16:24 【问题描述】:

我的 gsoap 客户端调用者在soap_call___ns4__QueryAccBalIO 的每一秒调用中都会出现段错误。根据 gsoap 的文档,我通过soap_malloc 分配内存并使用soap_end 释放它,并且在每个循环之后也调用soap_free 下面是我在客户端调用程序中使用的一些代码。

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 时,它会获得成功的结果。但是当我的客户端调用者第二次调用相同的函数时,它会出现段错误。

当我从代码中删除soap_end(soap) 和soap_free(soap) 时,它不会出现段错误,但是,如果不调用soap_end 和soap_free,它可能会面临内存泄漏问题。

【问题讨论】:

soap_endsoap_free 听起来像是调用会使您在开头使用 soap_new 创建的指针无效,并且段错误听起来像您在调用 soap_end/ 后重用该指针soap_free 就可以了。仅在完成 ​​soap_new 创建的对象后才调用 soap_end/soap_free 亲爱的凯尔,在每个循环中,每当调用线程时,soap 对象都会用soap_new 重新初始化。只调用soap_end 和soap_free,不需要soap 对象。 【参考方案1】:

像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);

【讨论】:

以上是关于gsoap 在我每第二次调用时都会对我的应用程序(用 C 编写)进行段错误的主要内容,如果未能解决你的问题,请参考以下文章

在哪里保存应用程序的激活数据?

iOS UITableView reloadData 仅在我第二次调用我的 reload 函数时刷新表

每次调用 Func 时都会重写 UIView

Angular Service 在每次调用时都会重置

我希望我的块每次在 Unity 中被击中时都会改变颜色,但不知道如何

Angular2,为啥每次移动鼠标时都会调用函数