Этот код не течет.Либо ваше обнаружение утечки неисправно, либо код, который вы на самом деле выполняете, является более сложным, чем этот, и утечка находится в коде, который вы не показали.
Единственная память, выделенная Delphi RTL, в кодев вопросе, для динамических строк.Динамическая обработка строк в Delphi не протекает.При вызовах WinSock, gethostbyname
и inet_ntoa
выделяется внутренняя память для WinSock.
В случае gethostbyname
:
Память дляструктура hostent, возвращаемая функцией gethostbyname, распределяется внутри Winsock DLL из локального хранилища потока.Выделяется и используется только одна структура hostent, независимо от того, сколько раз функции gethostbyaddr или gethostbyname вызываются в потоке.Возвращаемая структура hostent должна быть скопирована в буфер приложения, если необходимо выполнить дополнительные вызовы для функций gethostbyname или gethostbyaddr в том же потоке.В противном случае возвращаемое значение будет перезаписано последующими вызовами gethostbyname или gethostbyaddr в том же потоке.Внутренняя память, выделенная для возвращенной структуры hostent, освобождается Winsock DLL при выходе из потока.
И также для inet_ntoa
:
Строка, возвращаемая inet_ntoa, находится в памяти, выделенной сокетами Windows.Приложение не должно делать никаких предположений о том, каким образом выделяется память.Возвращаемая строка гарантированно будет действительной только до следующего вызова функции Windows Sockets в том же потоке.
Хотя верно то, что код в вопросе не вызывает WSACleanup
это нормально, так как возвращать ресурсы во время завершения процесса довольно бессмысленно.