今天群友A问:
gethostbyname 返回的是一个指针,这个指针的生存周期是到程序结束?
群友B答:
gethostbyname 返回只要指针没被释放或者 未出栈就一直在
(如果是指针的话,显然和定义的作用域有关。但返回的关键不是这个地址,而是个结构体数据,这个数据的生存期该到什么时候结束呢?为了把话题扯到正规)
我追问:
gethostbyname返回的是个指针,是个地址,地址释放了,原来的存的会释放吗?
群友答:
不需要释放
这点小内存
还没看到哪本书上释放了呢
现在不是128kb内存的时代了
(每次调用,都产生一些内存,积少成多,也是大隐患大,这十分不安全,肯定有我们不知道的原因)
------------------------
用OD跟踪编译好的,gethostbyname的返回数据的,发现他用的是堆上的数据,而子函数退出,内存也没被释放。
然后我第二次用gethostbyname,发现第二次的竟然和第一次的在同一个地址。
整理如下
gethostname(name, sizeof(name));//主机名
struct hostent FAR * pHostent;
pHostent = gethostbyname(name);//获得IP
char name2[128]={"VirtualXP-60916"};//其他主机名
gethostbyname(name2);//这里会覆盖pHostent指向的区域,造成本机IP获取错误
LPSTR lpAddr = pHostent->h_addr_list[0];
struct in_addr inAddr;
memmove (&inAddr, lpAddr, 4);
CString str = inet_ntoa (inAddr);
printf("本机地址:%s \n",str);//错误的本机IP
结论:
gethostbyname第二次调用的时候,会覆盖掉前一次的。
mark一下,以后出现bug,考虑下是不是这种情况。。。。