根据问题,我遇到了一些由getnameinfo泄漏的内存。我正在使用带有 gcc版本 4.6.3的 Ubuntu 12.04(Linux scv 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux) 。
我正在将我的服务器可执行文件与g++链接,到目前为止 valgrind 还没有报告问题。然后,我添加了一个对getnameinfo的简单调用,以打印出连接客户端的网络名称和端口。
我得到以下信息:
==4425== ==4425== 堆摘要: ==4425== 在退出时使用:1 个块中的 10 个字节 ==4425== 总堆使用量:4,508 分配,4,507 释放,134,939,153 字节分配 ==4425== ==4425== 1 个块中的 10 个字节肯定丢失在丢失记录 1 of 1 ==4425== 在 0x4C2B6CD:malloc(在 /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 中) ==4425== 由 0x50D7D71: strdup (strdup.c:43) ==4425== 由 0x1484B861: ??? ==4425== 0x515B871:gethostbyaddr_r@@GLIBC_2.2.5 (getXXbyYY_r.c:256) ==4425== 由 0x5161D06:getnameinfo (getnameinfo.c:223) ==4425== 由 0x404175: solsrv_run (solsrv.c:381) ==4425== by 0x404DAC: main (main.c:167) ==4425== ==4425== 泄漏摘要: ==4425== 肯定丢失:1 个块中的 10 个字节 ==4425== 间接丢失:0 个块中的 0 个字节 ==4425== 可能丢失:0 个块中的 0 个字节 ==4425== 仍然可达:0 个块中的 0 个字节 ==4425== 抑制:0 个块中的 0 个字节 ==4425== ==4425== 对于检测到和抑制的错误计数,重新运行:-v ==4425== 错误摘要:来自 11 个上下文的 12 个错误(抑制:2 个来自 2)
我究竟做错了什么?
代码简单如下:
struct sockaddr addr;
socklen_t addr_sz = sizeof(addr);
char host[NI_MAXHOST],
serv[NI_MAXSERV];
int infd = accept(srv_fd, (struct sockaddr*)&addr, &addr_sz);
if (infd == -1) {
... manage error on accept ...
}
if(getnameinfo((struct sockaddr *)&addr, addr_sz, host, NI_MAXHOST, serv, NI_MAXSERV, NI_NUMERICSERV)) {
strncpy(host, "<unknown host>", NI_MAXHOST-1);
strncpy(serv, "<unknown port>", NI_MAXSERV-1);
}
你有泄漏......
我可以确认,泄漏正在发生:对于 6 个连接的客户端, valgrind发现 60 个字节泄漏(我猜客户端是从同一个主机连接的,所以如果它与主机名有关,增长是线性的正如预期的那样)。
任何的想法?
干杯