Unix socket:hostent使内存泄漏

Gai*_*aim 1 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 */
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常但是当我使用跟踪内存时我占用了5个内存泄漏.它们由以下行创建:

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

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

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

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

小智 7

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

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

  • 我曾经使用过的所有内存分配跟踪器都会产生误报.无论如何,如果您希望您的应用程序完全可移植,则无法释放内存. (2认同)