这开始让我感到沮丧。
我正在尝试为接口编写一组模拟函数,以便测试将处理所有这些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, ¶ms, &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仍然说它泄漏了。
有趣的是,如果我向上下文管理器添加一个清理函数并在调用之间调用它,我可以摆脱一些泄漏。那么为什么析构函数做同样的事情,没有任何影响?
我正在放弃并感谢我的幸运星,这只是为了测试。客户端程序似乎没有泄漏。