Windows SDK 使用时的问题
我发现许多SDK中的函数都会返回某个结构的指针,如Winsock中gethostbyname,或是某个Windows消息的lParam参数(内含某个结构的指针),但我好像从来没有(也没看见别人有)自己删除这些指针的。那么这些被分配的内存空间到底是什么时候释放的呢?疑惑不解... 问题点数:20、回复次数:6Top
1 楼hjunxu(hjun)回复于 2004-12-01 09:58:25 得分 0
返回值是放在栈里面的,这个栈空间在进入函数调用的时候分配,返回时释放。
如果你这样写:object = GetReturn(); 它就会把返回值拷贝到object中,函数本身的空间栈还是被释放了。Top
2 楼hjunxu(hjun)回复于 2004-12-01 10:03:50 得分 6
关于消息里面的那些指针参数是在消息发起的地方分配空间的。
所以如果你这样写
void function()
{
struct DATA d ;
postmessage(hWnd, WPARAM(&d) ...);这样做是危险的,因为当消息响应的时候DATA d 已经被释放了。
sendmessage(hWnd, WPARAM(&d) ... );这样是可以的,因为sendmessage会到消息处理完成之后才被释放。
}Top
3 楼xdzha(zha.)回复于 2004-12-01 10:10:57 得分 0
消息虽然是这样,但是如gethostbyname这样返回指针的函数如何呢?它明明是返回一个指针而不是对象,而且我也是在gethostbyname函数调用完成后才根据其返回指针的内容做其它的事情的;若它是返回的一个栈空间,那函数调用完成后,这个栈空间也应该释放了啊。Top
4 楼captainwh(wh)回复于 2004-12-01 10:19:42 得分 6
gethostname这种即返回指针, 又不要求你分配或者释放内存的函数, 一般返回的指针都是指向一个windows在内部维护的结构体, 比如gethostname, 返回的指针指向一个 hostent 结构体, windows为每一个线程维护一个该结构体, 其内存是windows管理的, 所以不用担心会出现内存泄漏的问题。
Top
5 楼hjunxu(hjun)回复于 2004-12-01 10:28:43 得分 6
看MSDN的说明:
The gethostbyname function returns a pointer to a HOSTENT structure—a structure allocated by Windows Sockets. The HOSTENT structure contains the results of a successful search for the host specified in the name parameter.
The application must never attempt to modify this structure or to free any of its components. Furthermore, only one copy of this structure is allocated per thread, so the application should copy any information it needs before issuing any other Windows Sockets function calls.
这块内存是windows sockets帮你分配的,用户不应该尝试去改变或者释放他或它的任何一部分,并且每个线程只有一个拷贝,所以如果用户需要用他就必须拷贝他,因为到下次调用同类函数时它会被覆盖。
所以对于这个函数,这块内存是windows sockets维护的。用户可以不理。
Top
6 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-12-01 11:31:45 得分 2
嗯,系统为你维护的,不需要用户处理了Top




