gSoap中的分段错误,因为它从操作系统收到信号而停止了

时间:2013-06-26 16:30:37

标签: c++ gsoap

我有一个指针,当我取消引用它时,它会给我错误。问题是参数* ns__personRequestResponse

int __ns3__PersonRequest(soap *, _ns1__PersonRequest *ns1__PersonRequest, _ns1__PersonRequestResponse *ns1__PersonRequestResponse)
{
    ns1__PersonRequestResponse->result = 0;
    //ns1__PersonRequestResponse = new _ns1__PersonRequestResponse();
    *ns1__PersonRequestResponse->result = 39; // Error here
    return SOAP_OK;
}

以下是从wsdl创建的带有响应参数的头文件的一部分。

class _ns1__PersonRequestResponse
{ 
  public:
     /// Element result of type xs:int.
     int*                                 result                         0; ///< Nullable pointer.
     /// A handle to the soap struct that manages this instance (automatically set)
     struct soap                         *soap                          ;
};

当我为整数变量结果赋值时,我得到分段错误。我怎么能让它发挥作用?

1 个答案:

答案 0 :(得分:0)

结构中的结果字段是指向int的指针。在你的代码中,你 首先将其初始化为0,然后尝试通过该指针分配值。 但是在大多数系统上,这都会失败,因为地址0处的内存还没有 已分配给您的计划。

修复是为了确保result在尝试之前指向有效内存 通过该指针分配。究竟应该如何发生取决于 如何在您的代码中使用该结构。一种方法是 在函数之外声明一个int变量(可能在文件范围内), 然后获取其地址并将其分配给result

int my_result;  // This should be declared OUTSIDE of a function!

int __ns3__PersonRequest(soap *, _ns1__PersonRequest *ns1__PersonRequest, _ns1__PersonRequestResponse *ns1__PersonRequestResponse)
{
    ns1__PersonRequestResponse->result = &my_result;  // Make sure pointer points to valid memory
    *ns1__PersonRequestResponse->result = 39; // Updates the value of my_result
    return SOAP_OK;
}