我正在为 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 */
此代码工作正常,但当我使用 跟踪内存时,我发现了 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 和内存测试 mudflap 库
最佳答案
你没有说你在哪个平台上,但通常由 gethostbyaddr 返回的内存将由你正在使用的套接字库分配和管理——你不会自己释放它。无论您使用什么来诊断泄漏,都可能会给出误报。
例如,这个手册页 http://www.opengroup.org/onlinepubs/009695399/functions/gethostbyaddr.html说返回的指针可能指向静态数据,而 MS 使用线程本地存储。在这两种情况下都不能或不应该释放数据,在这两种情况下都不会发生泄漏。
关于c++ - Unix 套接字 : hostent makes memory leaks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1981723/