我正在为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库
答案 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
。