内存泄漏GETIPFROMHOST

Ben*_*iss 7 delphi memory-leaks winsock delphi-7 winsock2

我在这里有这个代码来从主机名中检索IP地址:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  winsock;

function GetIPFromHost(const HostName: string): string;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  i: Integer;
begin
  Result := '';
  phe := GetHostByName(PChar(HostName));
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  i := 0;
  while pPtr^[i] <> nil do
  begin
    Result := inet_ntoa(pptr^[i]^);
    Inc(i);
  end;
end;

var
wsaData: TWSAData;

begin

if (WSAStartup($0202, wsaData) <> 0) then begin
      Exit;
end;

while true do begin
sleep (1000);
GetIPFromHost ('localhost');
end;
Run Code Online (Sandbox Code Playgroud)

它工作正常,并给我IP地址.不幸的是,我需要这个功能几次来比较DNS和IP地址.

由于某种原因,我得到了很大的内存泄漏,我的程序的内存增长非常快.为什么这样,我怎么能释放记忆?

提前致谢.

Dav*_*nan 3

这段代码不会泄露。要么您的泄漏检测有问题,要么您实际运行的代码比这更复杂,并且泄漏位于您未显示的代码中。

在问题的代码中,Delphi RTL 分配的唯一内存是用于动态字符串的。Delphi动态字符串处理不会泄漏。调用WinSock,gethostbynameinet_ntoa分配WinSock内部的内存。

如果是gethostbyname

gethostbyname 函数返回的 hostent 结构的内存由 Winsock DLL 从线程本地存储内部分配。无论在线程上调用 gethostbyaddr 或 gethostbyname 函数多少次,都只会分配和使用单个 hostent 结构。如果要在同一线程上对 gethostbyname 或 gethostbyaddr 函数进行其他调用,则必须将返回的 hostent 结构复制到应用程序缓冲区。否则,返回值将被同一线程上的后续 gethostbyname 或 gethostbyaddr 调用覆盖。当线程退出时,Winsock DLL 会释放为返回的hostent 结构分配的内部内存。

同样对于inet_ntoa

inet_ntoa 返回的字符串驻留在由 Windows 套接字分配的内存中。应用程序不应对内存分配方式做出任何假设。返回的字符串仅保证在同一线程内进行下一个 Windows Sockets 函数调用之前有效。

虽然问题中的代码确实没有调用,WSACleanup但这没关系,因为在进程终止时回收资源是毫无意义的。