gSoap内存问题

时间:2011-12-20 00:35:07

标签: c++ gsoap

这开始让我感到沮丧。

我正在尝试为接口编写一组模拟函数,以便测试将处理所有这些SOAP垃圾的类。同时我希望以这样的方式编写它,我可以将其插入基本的SOAP服务器结构,并模拟我用于集成测试的服务。不幸的是,我遇到了一个我无法通过查看文档来解决的问题。

首先,我创建了一个RAII soap上下文结构:

struct soap_context
{
    soap_context()
        : ctx_(soap_new())
    {
        soap_begin(ctx_);
    }
    ~soap_context()
    {
        soap_destroy(ctx_);
        soap_end(ctx_);
        soap_done(ctx_);
        soap_free(ctx_);
    }

    soap* get() const { return ctx_; }

private:
    soap* ctx_;
};

根据我的理解,阅读应该是矫枉过正的文件。当上面的对象被销毁时,它应该绝对清理我用soap_new或soap_malloc分配的任何内存。这不是我目睹的行为。

我正在处理的界面非常糟糕。它有这个上层blob,包含必须分配的“return_”指针。其中包含一些必须分配的小blob。没有价值,这太容易了!

较小的内部斑点似乎被正确摧毁,但是上层一点......没有。

这是我创建的肥皂代码...一些名称已更改以保护有罪(下面所谓的“stupid_inner_bean”是未被释放的内容):

void * soap_calloc(soap* ctx, size_t size)
{
    void * ptr = soap_malloc(ctx, size);
    memset(ptr, 0, size);

    return ptr;
}

int __something_stupid( struct soap* ctx
                            , struct stupid_params * params
                            , struct stupid_response * response )
{
  response->return_ = static_cast<stupid_inner_bean*>(soap_calloc(ctx, sizeof(stupid_inner_bean));

  ... lots of inner stuff created with soap_calloc, but it DOES get freed...

  return SOAP_OK;
}

int soap_call___something_stupid( struct soap *ctx
                                , const char *
                                , const char *
                                , struct stupid_params *params
                                , struct stupid_response *response )
{
    return __something_stupid(ctx, params, response);
}

然后我在一些CppUnit测试中调用它:

{

    char * phones[] = {"12345678901","55555555555"};
    stupid_params params =
    {
      "test_user1"
    , "test_pass1"
    , 2
    , phones
    };
    stupid_response response = {};

    soap_context soap_ctx;

    soap_call___something_stupid(soap_ctx.get(), "IGNORED", 0, &params, &response);

    // OK to access directly without checks.  If we crash, we fail the test!
    CPPUNIT_ASSERT(response.return_->error == 0);
}

知道我可能遗失的是什么吗?对于soap_end()来说,删除使用soap_malloc创建的任何内容时,文档似乎都是非常具体的,明显相当模糊。常见问题解答说有关调试构建和等待soap_done,所以我打电话给它。尝试粘贴随机soap_begin()调用...卡住每一个肥皂调用,说它删除我的上下文管理器的析构函数中的东西...据我所知,我已经做了我需要的一切,然后一堆其他随意的废话...但是valgrind仍然说它泄漏了。

有趣的是,如果我向上下文管理器添加一个清理函数并在调用之间调用它,我可以摆脱一些泄漏。那么为什么析构函数做同样的事情,没有任何影响?

我正在放弃并感谢我的幸运星,这只是为了测试。客户端程序似乎没有泄漏。

0 个答案:

没有答案