Unix socket:hostent使内存泄漏

时间:2009-12-30 18:39:33

标签: c++ sockets memory-leaks

我正在为TCP连接编写客户端,从IP到socket_addr的转换会导致内存泄漏。

有以下过程:

#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>

/** there is some code like method header etc. */

hostent * host = gethostbyaddr( ip, 4, AF_INET ); // ip is char[4], I use IPv4

if ( !host ) return -2; // bad IP

netSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( netSocket == -1 ) return -3; // error during socket opening

sockaddr_in serverSock;
serverSock.sin_family = AF_INET;
serverSock.sin_port = htons( port );
memcpy( &( serverSock.sin_addr ), host->h_addr, host->h_length );

// and now there is function connect(...);

/** end of method */

此代码工作正常,但当我使用内存泄漏时跟踪内存时。它们是由这一行创建的:

hostent * host = gethostbyaddr( ip, 4, AF_INET ); // ip is char[4], I use IPv4

我尝试删除它delete host;,但这会导致分段错误。

你有什么想法我可以清理记忆吗?这是我的学校项目,我们必须正确处理内存。

编辑: 我正在使用Linux Ubuntu 9.04,g ++ 4.3.3和用于内存测试的mudflap库

4 个答案:

答案 0 :(得分:7)

您没有说明您所使用的平台,但通常gethostbyaddr返回的内存将由您正在使用的套接字库分配和管理 - 您不必自行释放它。无论您使用什么来诊断泄漏,都可能会产生误报。

例如,此手册页http://www.opengroup.org/onlinepubs/009695399/functions/gethostbyaddr.html表示返回的指针可能是静态数据,而MS使用线程本地存储。在任何情况下都不能或不应该释放数据,并且在任何情况下都不存在泄漏。

答案 1 :(得分:1)

来自MSDN的Windows gethostbyaddr函数备注的备注:

  

应用程序不应该尝试   释放使用的内存   返回的机构结构。该   应用程序绝不能尝试   修改此结构或释放任何   其组成部分。此外,只有   这个结构的一个副本是   每个线程分配,所以   申请应该复制任何   发布前需要的信息   任何其他函数调用   gethostbyaddr或gethostbyname。

答案 2 :(得分:1)

hostent结构由套接字库在内部分配,并保留以供后续调用重用。即使正如你所观察到的那样,记忆也没有被泄露。它没有被释放。

答案 3 :(得分:1)

根据getaddrinfo()的联机帮助页的建议,尝试使用freeaddrinfo()gethostbyname