C Valgrind报告getaddrinfo上的内存泄漏

C Valgrind报告getaddrinfo上的内存泄漏,c,valgrind,getaddrinfo,C,Valgrind,Getaddrinfo,我已经将代码精简到最低限度,尽管将servinfo设置为NULL并过度调用freeaddrinfo,但我仍然看到valgrind的内存泄漏--leak check=yes。我找到了,但我无法解决问题 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netdb.h> int main()

我已经将代码精简到最低限度,尽管将servinfo设置为NULL并过度调用freeaddrinfo,但我仍然看到valgrind的内存泄漏--leak check=yes。我找到了,但我无法解决问题

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netdb.h>

int main() {
  /* Declare connection variables */
  struct addrinfo hints, *servinfo;
  char port[6];
  servinfo = NULL;

  /* Set address attributes */
  memset(&hints, 0, sizeof hints);
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  sprintf(port, "%d", 8888);
  if (getaddrinfo(NULL, port, &hints, &servinfo) != 0) {
    freeaddrinfo(servinfo);
    fprintf(stderr, "> Error: getaddrinfo() failed.\n");
    exit(EXIT_FAILURE);
  }
  freeaddrinfo(servinfo);

  return 0;
}

有什么想法吗?这可能是OS X优胜美地的问题吗?感谢您的帮助……

我无法在我的计算机上重现此问题(带有gcc 5.2.0的linux 4.1)。Valgrind报告您提供的代码示例完全没有泄漏(
所有堆块都已释放--不可能有泄漏
)。因此,我建议您使用的
getaddrinfo
的实现中可能存在漏洞。是的,看起来实现中存在错误。切换到Ubuntu虚拟机,漏洞就消失了。那真是浪费了一个小时。。。但我不会再犯那种错误了!:)通常这些都是已知的问题,例如,
valgrind
可以检测到内存不足后,会释放一些内存。您观察到的不同系统之间的差异实际上是它应该抑制的
valgrind
错误的异常列表。因此,这两者之间的实际情况并没有改变,只是你对它的了解。Valgrind仅对现代OS X有初步支持。这种情况将在下一个Valgrind版本中得到显著改善,但目前在系统库中报告了大量已知的泄漏(即超出你的控制范围)。
==5199== 640 (320 direct, 320 indirect) bytes in 1 blocks are definitely lost in loss record 104 of 122
==5199==    at 0x100007351: malloc (vg_replace_malloc.c:303)
==5199==    by 0x10038EA3D: sa_dst_lookup (in /usr/lib/system/libsystem_network.dylib)
==5199==    by 0x10038E1F6: sa_dst_compare_internal (in /usr/lib/system/libsystem_network.dylib)
==5199==    by 0x1002144DE: _qsort (in /usr/lib/system/libsystem_c.dylib)
==5199==    by 0x1002B5F68: _gai_sort_list (in /usr/lib/system/libsystem_info.dylib)
==5199==    by 0x1002ADD30: si_addrinfo (in /usr/lib/system/libsystem_info.dylib)
==5199==    by 0x1002AD966: getaddrinfo (in /usr/lib/system/libsystem_info.dylib)
==5199==    by 0x100000EBC: main (test.c:19)