2009-12-30 43 views
1

我正在编写TCP连接的客户端,并且从IP到socket_addr的转换会导致内存泄漏。Unix套接字:hostent使内存泄漏

还有就是以下过程:

#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 */ 

此代码工作正常,但是当我使用跟踪内存我花了5个内存泄漏。他们是由该行创建:

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

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

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

编辑: 我使用Linux操作系统Ubuntu 9.04,G ++ 4.3.3和存储器测试挡泥板库

回答

7

你不说你是什么平台上,但通常是由gethostbyaddr返回的内存将被分配和由你正在使用的套接字库管理 - 你不要自己释放它。无论你用什么来诊断泄漏,都可能带来误报。

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

+0

我使用Linux Ubuntu 9.04与g ++编译器4.3.3。我用mudflap测试内存,它工作的很好,所以我不认为这是误报 – Gaim 2009-12-30 18:52:57

+2

我曾经使用的所有内存分配跟踪器都会给出误报。无论如何,如果您希望您的应用程序完全可以随身携带,则无法释放内存。 – 2009-12-30 18:55:58

+0

感谢您的解决方案,虽然它并不令我高兴。 – Gaim 2009-12-30 19:06:30

1

记者问在MSDN

的应用程序不应该试图 释放由 使用的内存返回hostent结构。 应用程序绝不会尝试修改此结构或释放其组件的任何 。此外,只有 一个这个结构的拷贝 每个线程分配的,所以 应用程序应该在发出 任何其他函数调用 gethostbyaddr或之前的gethostbyname需要任何 信息拷贝。

+0

感谢您的信息,但它不能解决我的漏洞问题 – Gaim 2009-12-30 18:54:53

1

hostent结构由套接字库内部分配,并保留以供后续调用重用。即使如你所观察到的那样,记忆也不会被泄漏。

+0

我使用Unix套接字,所以它不是WinSock - 它是在主题名称 – Gaim 2009-12-30 18:55:40

1

尝试使用getaddrinfo()freeaddrinfo(),如gethostbyname的联机帮助页中所示。

+0

好吧,我会试试看,谢谢。你能给我一个手册页链接吗?我试图找到它,但没有成功。 – Gaim 2009-12-30 18:56:39