调用libpcap的pcap_findalldevs接口后出现内存泄漏是什么原因?
问题原因
你遍历设备链表时直接修改了pcap_findalldevs输出的链表头指针,遍历完成后该指针已经被移动到链表末尾变为NULL,此时传入pcap_freealldevs的参数是空指针,无法完成内存释放操作,因此出现内存泄漏。
修正方案
你需要额外定义一个变量保存链表头的原始地址,遍历的时候用临时指针操作,遍历完成后将原始链表头传入释放接口即可。
修正后的完整代码如下:
#include <pcap.h> #include <stdio.h> #include <stdlib.h> int main() { char errbuf[PCAP_ERRBUF_SIZE] = {0}; pcap_if_t *dev_list = NULL; pcap_if_t *it = NULL; if(pcap_findalldevs(&dev_list, errbuf) == 0) { it = dev_list; while (it) { printf("%s - %s\n", it->name, it->description); it = it->next; } // 传入原始链表头释放整个列表 pcap_freealldevs(dev_list); } else { printf("error: %s\n", errbuf); exit(-1); } return 0; }
修改完成后重新编译运行,valgrind就不会再检测到该内存泄漏问题。
内容的提问来源于stack exchange,提问作者mchen
相关产品推荐
相关产品推荐

