CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

Windows SDK 使用时的问题

楼主xdzha(zha.)2004-12-01 09:47:14 在 VC/MFC / 基础类 提问

我发现许多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

相关问题

  • SDK编程时如何使用控件?
  • 如何打包使用了windows media player sdk的程序
  • 如何使用sdk
  • Combobox的使用问题(SDK)
  • SDK中如何使用ListCtrl???
  • windows sdk 编程
  • Microsoft Windows SDK?
  • Windows BlueTooth SDK
  • 在MFC工程里可以使用Platform SDK: Windows Multimedia里的DWORD timeGetTime(VOID)(在Mmsystem.h中定义的)函数吗?
  • 在windows sdk api程序框架下怎么使用CString,要包含什么头文件

关键词

  • 函数
  • 指针
  • 内存
  • 结构
  • 消息
  • 维护
  • 用户
  • sockets
  • 返回
  • 释放

得分解答快速导航

  • 帖主:xdzha
  • hjunxu
  • captainwh
  • hjunxu
  • oyljerry

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo