两个函数都返回struct hostent *
。
我想知道的是结构创建/存储在内存中的确切位置?
我的猜测是它必须在堆上,但是手册页并没有警告我们释放返回的指针。
它不能在堆栈上,否则当函数返回时该地址不再有效...
我在这里错过了什么吗?
答案 0 :(得分:2)
首先,这两个功能都被认为已过时,应由getaddrinfo
& getnameinfo
。
对于内存,应将其视为不应释放的临时静态数据。规范本身并没有声明应该如何实现。
在Windows中:
gethostbyname函数返回的hostent结构的内存由Winsock DLL从线程本地存储内部分配。
在Linux中(来自此manual):
函数gethostbyname()和gethostbyaddr()可能会返回指向静态数据的指针,这些指针可能会被以后的调用覆盖。复制struct hostent是不够的,因为它包含指针;需要深层复印。
答案 1 :(得分:1)
在Windows中,它存储在线程退出时自动回收的每线程数据中。这使得多个线程可以调用API而不会相互踩踏。当然,任何单个线程都不能期望跨越调用来维护hostent
。
我不知道它在类Unix环境中是如何工作的。