【问题标题】:valgrind reports memory leak in gsoapvalgrind 报告 gsoap 中的内存泄漏
【发布时间】:2017-11-14 07:41:35
【问题描述】:

Valgrind 正在检测 Gsoap 中的一些内存泄漏。这是一个非常基本的示例代码:

//file hr.cpp
#include "soapH.h"  
#include "ns1.nsmap"

int main()
{
    struct soap *soap_ = soap_new();

    soap_destroy(soap_);
    soap_end(soap_);
    //soap_done(soap_);
    soap_free(soap_);

    return 0;
}

为了编译这段代码,我使用了这个:

g++ -D DEBUG -g -std=c++0x -o hr hr.cpp soapC.cpp stdsoap2.cpp

这些是 Valgrind 报告的内存泄漏:

==5290== HEAP SUMMARY:
==5290==     in use at exit: 72,800 bytes in 4 blocks
==5290==   total heap usage: 18 allocs, 14 frees, 244,486 bytes allocated
==5290==
==5290== 32 bytes in 1 blocks are definitely lost in loss record 1 of 4
==5290==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5290==    by 0x41D6FF: soap_track_malloc (stdsoap2.cpp:8952)
==5290==    by 0x421347: soap_set_logfile (stdsoap2.cpp:10022)
==5290==    by 0x421402: soap_set_test_logfile (stdsoap2.cpp:10062)
==5290==    by 0x422391: soap_init_REQUIRE_lib_v20851 (stdsoap2.cpp:10405)
==5290==    by 0x43DD31: soap::soap() (stdsoap2.cpp:20074)
==5290==    by 0x41AF2E: soap_new_REQUIRE_lib_v20851 (stdsoap2.cpp:8109)
==5290==    by 0x40238C: main (hr.cpp:6)
==5290==
==5290== 32 bytes in 1 blocks are definitely lost in loss record 2 of 4
==5290==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5290==    by 0x41D6FF: soap_track_malloc (stdsoap2.cpp:8952)
==5290==    by 0x421347: soap_set_logfile (stdsoap2.cpp:10022)
==5290==    by 0x4213DA: soap_set_sent_logfile (stdsoap2.cpp:10050)
==5290==    by 0x4223A2: soap_init_REQUIRE_lib_v20851 (stdsoap2.cpp:10406)
==5290==    by 0x43DD31: soap::soap() (stdsoap2.cpp:20074)
==5290==    by 0x41AF2E: soap_new_REQUIRE_lib_v20851 (stdsoap2.cpp:8109)
==5290==    by 0x40238C: main (hr.cpp:6)
==5290==
==5290== 32 bytes in 1 blocks are definitely lost in loss record 3 of 4
==5290==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5290==    by 0x41D6FF: soap_track_malloc (stdsoap2.cpp:8952)
==5290==    by 0x421347: soap_set_logfile (stdsoap2.cpp:10022)
==5290==    by 0x4213B2: soap_set_recv_logfile (stdsoap2.cpp:10038)
==5290==    by 0x4223B3: soap_init_REQUIRE_lib_v20851 (stdsoap2.cpp:10407)
==5290==    by 0x43DD31: soap::soap() (stdsoap2.cpp:20074)
==5290==    by 0x41AF2E: soap_new_REQUIRE_lib_v20851 (stdsoap2.cpp:8109)
==5290==    by 0x40238C: main (hr.cpp:6)
==5290==
==5290== LEAK SUMMARY:
==5290==    definitely lost: 96 bytes in 3 blocks
==5290==    indirectly lost: 0 bytes in 0 blocks
==5290==      possibly lost: 0 bytes in 0 blocks
==5290==    still reachable: 72,704 bytes in 1 blocks
==5290==         suppressed: 0 bytes in 0 blocks
==5290== Reachable blocks (those to which a pointer was found) are not shown.
==5290== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==5290==
==5290== For counts of detected and suppressed errors, rerun with: -v
==5290== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)

我做错了什么? 我错过了任何指示吗?我已经阅读了 gsoap 文档和互联网,但没有找到任何东西。

非常感谢!

【问题讨论】:

  • 我对 gSoap 不熟悉,但这真的是它在 C++ 中应该如何工作吗?我在这里看到github.com/stoneyrh/gSOAP/blob/master/gsoap/stdsoap2.cpp 有一个调用destroy/end/done 的析构函数。
  • 嗨,Paul,我看了一下,可以删除对 soap_done 的调用。但是 Valgrind 仍然报告相同的内存泄漏
  • 看起来库保持初始化状态。这是有问题的原因吗?您希望它在每次创建对象时自行初始化吗?

标签: memory-leaks valgrind gsoap


【解决方案1】:

不要使用-DDEBUG 编译您的代码以使用 valgrind 进行测试,因为它会激活 gSOAP 的内部内存泄漏检查器。这可能会干扰 valgrind。

编辑:

我使用最新版本 2.8.61 验证了这一点,该版本在 DEBUG 模式或其他情况下显示没有泄漏。我建议升级到 gSOAP 2.8.61。

【讨论】:

  • 您好,感谢您的回复!但这不是一个选择。我的测试组抱怨内存增长太快,那是因为这个 gsoap 代码。
  • 我明白,但是在使用-DDEBUG 时执行soap_done() 会删除分配的内存,而不是更早。所以soap_destroy()soap_end() 效果有限。这样做的原因很简单:当取消引用在您的代码或引擎中释放的数据时,它有助于检测问题。安全总比后悔好。你不应该在生产代码中使用-DDEBUG
  • 您好 Alex RE 博士,再次感谢您的回复,但在阅读您的评论后,我无法理解为什么 gsoap 在调试环境中存在内存泄漏(我没有在生产环境中使用 -DDEBUG)。
  • 也许您使用的是旧版本?尝试更新的 gSOAP 版本。从soap_track_malloc 我可以看出你的代码是用-DDEBUG 编译的。在我这边运行这个示例不会显示泄漏。
猜你喜欢
  • 1970-01-01
  • 2020-09-17
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多