valgrind在使用libcurl时检测到内存泄漏(没有ssl)

在我的C程序中,我使用了libcurl的一些基本function。 今天我跑了valgrind,以检查我是否有内存泄漏,valgrind疯狂报告多个错误。

我跟踪它基本上是:

CURL *curl; CURLcode res; curl = curl_easy_init(); // ... curl_easy_cleanup(curl); 

如果我完全删除使用libcurl的代码,valgrind不会报告任何错误。

我已经读过使用带有libcurl和ssl的valgrind有一些问题,但我不提取任何httpsurl等。

我能做什么? 我可以让valgrind关闭libcurl错误(可能出现误报吗?)并仅报告我的代码中的错误? 尽管libcurl使用最简单,但由于存在大量错误,因此valgrind的输出非常混乱。

不幸的是我没有安装libcurl构建的调试,所以valgrind甚至不会报告它检测到泄漏的行号/文件。 错误消息如下所示:

 ==27330== ==27330== HEAP SUMMARY: ==27330== in use at exit: 34,960 bytes in 2,406 blocks ==27330== total heap usage: 20,130 allocs, 17,724 frees, 2,511,576 bytes allocated ==27330== ==27330== 40 (20 direct, 20 indirect) bytes in 1 blocks are definitely lost in loss record 383 of 445 ==27330== at 0x4025BD3: malloc (vg_replace_malloc.c:236) ==27330== by 0x4B173FD: ??? ==27330== by 0x4B17A8B: ??? ==27330== by 0x4B84957: ??? ==27330== by 0x4B849FD: ??? ==27330== by 0x4B72814: ??? ==27330== by 0x4B734C1: ??? ==27330== by 0x4B78DE2: ??? ==27330== by 0x4B7524B: ??? ==27330== by 0x49B2F76: ??? ==27330== by 0x49C9ECB: ??? ==27330== by 0x49BC96A: ??? ... 

我知道这个答案将在一年后出现,但有人可能仍然觉得它很有帮助。
在调用curl_easy_cleanup(curl) ,尝试添加对curl_global_cleanup()的调用。

这对我有用。

如果您从第一个libcurl示例(simple.c)开始,它们最后不会调用curl_global_init(long flags)curl_global_cleanup() ,而valgrind将报告潜在的问题。 正如libcurl文档中所述,你必须调用curl_global_initcurl_global_cleanup 。 我证实了自己解决了这个问题; valgrind将报告所有堆块都被释放。

libcurl不泄漏但它可能会使用会警告valgrind的技术。 那么,从其他答案重复一遍,valgrind报告的错误是什么?

我不指望你有libcurl源,但是,如果你这样做,valgrind错误指向哪里?

你实际得到了什么错误?

同样重要的是 – 泄漏是静态的,还是随着时间的推移而增长? 随着时间的推移,小的一次性静态泄漏远不如泄漏那么重要。

这也可能是Valgrind的误报; 取决于具体的错误以及您看到的位置。

很可能valgrind只是在解决libcurl 。 通常对于这样的库,它没有正确地看到分配/解除分配的一端并且混淆。 一个好的操作系统发行版应该为你提供“抑制”文件,但很明显你没有这样做。 您可以使用选项--suppressions--gen-suppressions来处理这些问题,甚至可以将这些内容放在配置文件中。

我在邮件列表上询问,没有人可以确切地告诉我我的问题在哪里,因为我仍然确定我安装了最新的libcurl版本的调试版本,但我仍然看不到任何调试符号。

无论如何,我设置了一个新的虚拟机并从源代码编译了libcurl,奇怪的错误信息消失了。

遗憾的是,我没有找到任何更有用的东西,虽然这可能帮助其他人解决同样的问题……