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_end
和 soap_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 函数时刷新表