gpt4 book ai didi

c++ - getnameinfo 内存泄漏是否得到确认?

转载 作者:IT老高 更新时间:2023-10-28 23:21:33 25 4
gpt4 key购买 nike

根据问题,我遇到了 getnameinfo 导致的一些内存泄漏。我正在使用 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)和 gcc 版本 4.6.3.
我正在将我的服务器可执行文件与 g++ 链接,到目前为止 valgrind 还没有报告问题。然后,我添加了一个对 getnameinfo 的简单调用,以打印出连接客户端的网络名称和端口。
我得到以下信息:

==4425== ==4425== HEAP SUMMARY:==4425==     in use at exit: 10 bytes in 1 blocks==4425==   total heap usage: 4,508 allocs, 4,507 frees, 134,939,153 bytes allocated==4425== ==4425== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1==4425==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)==4425==    by 0x50D7D71: strdup (strdup.c:43)==4425==    by 0x1484B861: ???==4425==    by 0x515B871: gethostbyaddr_r@@GLIBC_2.2.5 (getXXbyYY_r.c:256)==4425==    by 0x5161D06: getnameinfo (getnameinfo.c:223)==4425==    by 0x404175: solsrv_run (solsrv.c:381)==4425==    by 0x404DAC: main (main.c:167)==4425== ==4425== LEAK SUMMARY:==4425==    definitely lost: 10 bytes in 1 blocks==4425==    indirectly lost: 0 bytes in 0 blocks==4425==      possibly lost: 0 bytes in 0 blocks==4425==    still reachable: 0 bytes in 0 blocks==4425==         suppressed: 0 bytes in 0 blocks==4425== ==4425== For counts of detected and suppressed errors, rerun with: -v==4425== ERROR SUMMARY: 12 errors from 11 contexts (suppressed: 2 from 2)

What am I doing wrong?
Code is simply as follows:

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 个字节泄漏(我猜客户端是从同一主机连接的,所以如果它与主机有关正如预期的那样,增长是线性的)。
有什么想法吗?

干杯

最佳答案

终于发现了真正的泄漏。

当连接到服务器套接字时,使用 name.local 而不是 localhost 和/或完全限定的名称。
getnameinfo() 然后会泄漏。

我可以在 x64x86 上重现 12.0412.10 上的错误。
如果我在它泄漏的名称上指定 .local 连接。

干杯

关于c++ - getnameinfo 内存泄漏是否得到确认?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com