c++ - Unix 套接字 : hostent makes memory leaks

标签 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 */

此代码工作正常,但当我使用 跟踪内存时,我发现了 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/

相关文章:

C++ 标准布局和引用

c++ - 如何从 Visual Studio 调试器执行所有进程内存的高级搜索?

iphone - iOS NSDictionary 复制内存泄漏

c++ - gdb os x sierra 10.12.3 不工作

c++ - 如何增加应用程序数据的虚拟内存页面文件的大小

c++ - 创建 CoApp .autopkg 将文件从 redist 包文件复制到 $(TargetDir) 的子目录

winapi - 如何使用 BindIoCompletionCallback 检测 WinSock TCP 超时

c - 连接到文件中的服务器时出错

python - python客户端和perl服务器: packing and unpacking bytes to send/receive

java - JDK1.7 类加载器内存泄漏