CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

VarArrayCreate的释放内存问题?

楼主feiyunxiaozi()2005-06-03 13:58:25 在 Delphi / VCL组件开发及应用 提问

我用VarArrayCreate不停地创建字节类型数组,开始程序才占用2-3M内存,然后程序运行一段长时间后,程序就占用了20多M内存,请问怎样释放VarArrayCreate创建的东西呢?  
   
  下面是我的程序:(是一个控件接收到串口数据后的处理,当我不停地接收时候,过了一段足够长时间程序就占用好多内存)  
  procedure   TFMain.MSComm1Comm(Sender:   TObject);  
  var  
      oTmp   :   OleVariant;      
      vTmp   :   Variant;  
  begin  
          Len   :=   MSComm1.InBufferCount;          
          oTmp   :=   MSComm1.Input;      
          vTmp   :=   VarArrayCreate([0,   len-1],   varByte);      
          vTmp   :=   oTmp;  
          进行一些操作。。。  
  end;  
   
   
  问题点数:100、回复次数:15Top

1 楼feiyunxiaozi()回复于 2005-06-03 14:10:58 得分 0

先自己顶一个Top

2 楼feiyunxiaozi()回复于 2005-06-03 14:22:54 得分 0

没人知道吗?Top

3 楼heluqing(鉴之小河〖劳累求充实〗)(vcl .net)回复于 2005-06-03 14:48:18 得分 5

不懂,Up...Top

4 楼comanche(太可怕)回复于 2005-06-03 15:05:47 得分 0

VarArrayCreate   建立的内存是引用记数的,   只要计数为   0   时会自动释放,   这段代码在函数完成后就释放了Top

5 楼feiyunxiaozi()回复于 2005-06-03 15:15:54 得分 0

TO:comanche(太可怕)  
  函数完成后指的是  
  vTmp   :=   VarArrayCreate([0,   len-1],   varByte);  
  运行完后就释放吗?  
   
  不会吧Top

6 楼jslygwx(海豚)回复于 2005-06-03 15:29:18 得分 0

vtmp.free?Top

7 楼comanche(太可怕)回复于 2005-06-03 15:55:39 得分 0

你下面不是还有操作嘛,   在函数退出时,   vTmp   生存期结束,   他会给分配的内存作引用   -1,   =0   时就会释放Top

8 楼comanche(太可怕)回复于 2005-06-03 16:00:22 得分 0

你可以试一下,    
   
  var  
      temp:   Variant  
      ptr:   PChar;  
  begin  
      temp   :=   VarArrayCreate([0..1024*1024],   varByte);   //   建立   1m   内存  
      ptr   :=   VarArrayLock(temp);  
      try  
          ptr[0]   :=   'h';     //   在这放一个断点,   看windows任务管理器,   等一会,   看内存占用  
          ptr[1]   :=   #0;  
          ShowMessage(strint(ptr));  
      finally  
          VarArrayUnlock(ptr);  
      end;  
  end;   //   在退回后,   调用者下一句放断点,   看内存会不会释放  
   
   
  还有,   Variant,   OleVariant   在   delphi   下是通用的,   只要定义   Variant   类型就可调用任何com方法.Top

9 楼feiyunxiaozi()回复于 2005-06-06 10:39:39 得分 0

TO:comanche(太可怕)  
  请问你的意思是不是Delphi会自动释放内存,而不用任何操作?  
  但我的怎么就会内存不断的增加呢?  
  能说详细一点吗Top

10 楼comanche(太可怕)回复于 2005-06-06 13:26:13 得分 0

用   bcb   就可以看到,   Variant   析构函数,   if   ReleaseRef   =   0   then   内存释放  
  你的内存增加不是这里发生的Top

11 楼feiyunxiaozi()回复于 2005-06-06 14:05:39 得分 0

TO:comanche(太可怕)  
  请问“if   ReleaseRef   =   0   then   内存释放”中的ReleaseRef   是什么东西,  
  还有你的意思是不是说我的内存增加不是VarArrayCreate所造成的问题?Top

12 楼comanche(太可怕)回复于 2005-06-06 14:44:50 得分 35

对,   内存增加不是这里产生的  
   
  看   IUnkonw   接口,   所有自动对像,   都是用此类办法作引用记数  
   
  引用记数也可以在设计模式里找到Top

13 楼feiyunxiaozi()回复于 2005-06-06 15:45:08 得分 0

TO:comanche(太可怕)  
  下面是我的MSComm1Comm事件的代码,那你认为是那里出现内存泄漏问题呢?  
   
  procedure   TFMain.MSComm1Comm(Sender:   TObject);  
  var  
      Len,post,i,j   :   Integer;  
      oTmp   :   OleVariant;      
      sTmp   :   string;      
      bTmp   :   byte;  
      vTmp   :   Variant;  
  begin                        
      try  
          Len   :=   MSComm1.InBufferCount;          
          oTmp   :=   MSComm1.Input;              
          vTmp   :=   VarArrayCreate([0,Len-1],   varByte);  
          vTmp   :=   oTmp;  
          sTmp:='';  
          post   :=   0;  
          i   :=   0;  
          while   i   <   Len   do     begin  
          try  
              if   vTmp[i]=   $1C   then   begin  
                  while   vTmp[i]<>   $54   do  
                  begin  
                      bTmp   :=   vTmp[i];  
                      AByteGet[counter]   :=   vTmp[i];  
                      sTmp   :=   sTmp   +   inttohex(ord(chr(bTmp)),2)+   '   ';     //16进制接收  
                      Inc(counter);  
                      Inc(i);  
                  end;  
                  AByteGet[counter]   :=   $54;  
                  mun   :=   counter+1;  
                  counter   :=   0;                
                  sTmp:='';  
              end   //end   if  
              else   Inc(i);  
          except  
   
          end;  
          end;//end   wihile      
      finally  
          vTmp   :=   -1;          
      end;    
   
  end;  
  Top

14 楼feiyunxiaozi()回复于 2005-06-07 16:59:50 得分 0

顶阿Top

15 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2005-06-07 17:36:37 得分 60

最后用  
   
      vTmp   :=     Unassigned;  
  应该就可达到让系统自己释放的效果Top

相关问题

  • 释放内存
  • 内存释放
  • 内存释放
  • 释放内存?
  • 内存未释放?
  • delphi中内存的释放
  • 怎样释放内存?
  • 释放内存的问题。
  • 内存释放问题
  • 内存释放的问题

关键词

  • 内存
  • 函数
  • vtmp
  • vararraycreate
  • 释放
  • mscomm1
  • otmp
  • comanche
  • varbyte
  • releaseref

得分解答快速导航

  • 帖主:feiyunxiaozi
  • heluqing
  • comanche
  • aiirii

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

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