繁体   English   中英

为什么valgrind在调用`pcap_open_offline`时报告内存泄漏?

Why does valgrind report a memory leak when calling `pcap_open_offline`?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想弄清楚我是在白痴还是libpcap中确实存在内存泄漏。 我正在运行Ubuntu 17.10和libpcap 1.8.1-5ubuntu1。 这样一个成熟的库似乎不太可能出现泄漏。

我已经裁剪出所有内容来制作MVCE,因此,此代码除了演示泄漏之外并没有做任何事情:

#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>

int main(int argc, char **argv)
{
        char errbuf[PCAP_ERRBUF_SIZE];

        pcap_t *fd = pcap_open_offline(argv[1], errbuf);

        if (!fd) {
                printf("error: %s\n", errbuf);
        }

        free(fd); fd = 0;

        return 0;
}

valgrind报告(添加了重点):

==6871==
==6871== HEAP SUMMARY:
==6871==     in use at exit: 262,696 bytes in 2 blocks
==6871==   total heap usage: 4 allocs, 2 frees, 267,432 bytes allocated
==6871==
==6871== Searching for pointers to 2 not-freed blocks
==6871== Checked 73,072 bytes
==6871==
==6871== 262,144 bytes in 1 blocks are definitely lost in loss record 2 of 2
==6871== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==6871== by 0x4E5B89F: ??? (in /usr/lib/x86_64-linux-gnu/libpcap.so.1.8.1) ==6871== by 0x4E5AE5C: pcap_fopen_offline_with_tstamp_precision (in /usr/lib/x86_64-linux-gnu/libpcap.so.1.8.1) ==6871== by 0x4E5B05D: pcap_open_offline_with_tstamp_precision (in /usr/lib/x86_64-linux-gnu/libpcap.so.1.8.1) ==6871== by 0x1087A0: main (test.c:9)
==6871==
==6871== LEAK SUMMARY:
==6871==    definitely lost: 262,144 bytes in 1 blocks
==6871==    indirectly lost: 0 bytes in 0 blocks
==6871==      possibly lost: 0 bytes in 0 blocks
==6871==    still reachable: 552 bytes in 1 blocks
==6871==         suppressed: 0 bytes in 0 blocks
==6871== Reachable blocks (those to which a pointer was found) are not shown.
==6871== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==6871==
==6871== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
==6871== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
1 个回复

libpcap联机帮助页中 ,进行了稍微编辑:

pcap_fopen_offline()返回指向pcap_t的指针,该指针是用于读取数据包的句柄……要关闭句柄,请使用pcap_close()

free(fd)仅释放一个内存块,因为free()pcap_t的内部pcap_t 为了正确处理分配的资源,您需要使用pcap_close(fd) ,如文档所示。

3 Valgrind在使用API​​时报告内存泄漏

我正在使用Dyninst API构建应用程序,并且使用简单的Hello World应用程序会产生很多内存泄漏。 Dyninst正在部分地管理自己的内存,我很好奇Valgrind是否会将内存报告为“泄漏”。 我正在使用C ++,但还不是100%满意,所以,如果我忘记提供任何有帮助的信息,请 ...

5 Valgrind在定义char *数组时报告内存泄漏

我还有另一个无法识别的valgrind错误。 我有一些代码加载脚本,然后使用strtok()标记已加载到缓冲区的脚本中的数据。 我使用以下方法在堆上为缓冲区分配内存: 然后在函数结尾,我使用以下命令释放内存: Valgrind如此报告分配: Valgrind还报告了我 ...

6 Valgrind为字符串分配值时报告内存泄漏

为字符串分配值时,Valgrind报告内存泄漏。 我使用以下简单代码来测试Valgrind报告的内存泄漏。 我使用以下命令进行编译: 当我运行Valgrind时,它在尝试为字符串分配值时报告内存泄漏。 我正在使用此简单测试来调查实际程序中的某些内存泄漏,并且似乎使用字符串 ...

7 Valgrind报告getaddrinfo上的内存泄漏

我已经将代码精简到最低限度,尽管将servinfo设置为NULL并过多地调用了freeaddrinfo,但我仍然看到valgrind --leak-check = yes发生内存泄漏。 我找到了该线程,但无法解决问题。 这是代码: 这是valgrind输出: 有任何想法吗 ...

8 Valgrind在尝试释放malloc的结构时报告内存错误

当释放以前分配的结构时,Valgrind总是抱怨存在内存错误。 该结构如下所示: ...我通过使用分配内存 然后,通过简单地调用free(b);释放结构free(b); 。 Valgrind对此似乎并不满意,因此它告诉我 当然,我不能只分配8个字节,因为那将是存储指 ...

9 Valgrind在使用Boost线程时报告“可能丢失”内存

我有一个程序在一个单独的therad中运行一些动作,然后加入线程,比如这个: 如果我在其上运行Valgrind,它会报告“可能丢失”的内存。 如果省略join() ,这似乎是合乎逻辑的,因为在这种情况下,当程序退出时线程仍在运行。 但如果线程完成,我希望没有警告。 这是回溯: ...

10 Valgrind在调用wcstombs时报告未初始化的值

我偶然发现了Valgrind报告,我无法自己解决。 我有一个函数,可以从文件中读取Microsoft“ unicode”字符串(一系列由大小写为前缀的两字节对齐的wchar_t)。 示例文件可能如下所示: 下面的代码示例从文件中读取“ unicode”字符串,并使用wcstombs从 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM