当前位置:首页
开发技术指南» 文章正文
    引言:

 ·很简单但不容易回答的问题    »显示摘要«
    摘要: declare @tb1 table (item varchar(10),[date] char(8),[money] decimal) insert into @tb1 select 001, 20050617, 10 union all select 002, 20050617, 20 union all select 003, 20050617, 33 union all selec......
    摘要: delphi直接读文本文件然后逐行读取数据的程序怎么写?急急急! ......


Delphi内存释放的问题,在线等

Timer.Interval   :=   50;  
  在TTimer   的OnTimer事件中  
  begin  
      Args.NumDatas   :=   255;  
      GetMem(Args.pDataBlock,   Args.NumDatas   *   sizeof(SDataBlock));  
   
          Data   :=   TData.Create;  
          FList.Add(Data);    
   
   
      finally  
          FreeMem(Args.pColorCodeCCHDataBlock);  
      end;  
  end;  
  不知道为什么我只要加上  
          Data   :=   TData.Create;  
          FList.Add(Data);    
  就会有内存泄露,应用程序的内存使用量不停的增加,而且速度特别快,绝对不止增加一个TData占用的内存。  
  而如果我把中间两句改成  
          Data   :=   TData.Create;  
          Data.Free;  
  即把刚申请的内存释放掉,则一切正常。    
   
  不知道哪位老大遇到过这样的问题啊?

NO.1   作者: yonny

Data   :=   TData.Create;  
          FList.Add(Data);  
          Data.Free;  
   
  或者可以用FreeAndNil(Data);

NO.2   作者: Larry1030

你是运用我觉得好惊讶的,   什么需求一定要求把内存分配动作放在在TTimer   的OnTimer事件中   !  
      这样可能系统还未释放就已经退出了这个事件  
   你这里的flist是什么类?  
   如果是TObjectList的对象,也许可以不释放保存的对象,其余的是需要手动释放的  
 

NO.3   作者: cuilj

在Timer事件中加入  
  Data   :=   TData.Create;  
          FList.Add(Data);    
  这绝对是不可取的,因为你必须要手工去释放Flist中的所有对象。  
  随着时间的推移,内存中的对象越来越多  
   
  不明白楼主为什么要这么做?应该会有更好的方法。  
  下班了,公司断网了,明天再关注。  
  QQ:56096682  
 

NO.4   作者: g961681

你用Timer不停的创建,也没见你释放啊!  
  当然不行了!

NO.5   作者: DelphiGuy

FList.Add(Data);  
  只是添加了一个指向数据的指针而已。  
  FreeMem(Args.pDataBlock);  
  仅仅释放了存放指针的数据空间,指针指向的数据并没有释放。  
 

NO.6   作者: hunterht

每次OnTimer你都FList.Add(Data);一次,内存怎么可能不增加?不明白你要干什么

NO.7   作者: Larry1030

那可能是由于你的     Timer.Interval   :=   50; 的缘故  
  释放这样试:  
  var  
      I:   Integer;  
  begin  
      for   I   :=   0   to   aList.Count   -   1   do  
      begin  
          TData(aList.Items[I]).Free  
      end;  
  end;  
      
 

NO.8   作者: grjs2004

Data   :=   TData.Create;  
          FList.Add(Data);    
   
   
      finally  
          FreeMem(Args.pColorCodeCCHDataBlock);  
      end;  
   
  这样写绝对有问题的!  
  改成  
      try  
          Data   :=   TData.Create;  
          ...  
          Data.close;  
          Data.Free;    
      finally  
          Exit;  
      end;  
   
  还有在onTimer里以时间间隔为50这样不停的创建,而不释放,那肯定会出现内存泄露的问题啦!  
  要么你在Timer.Interval   :=   50; 时释放一次,那就不会出现那问题啦!  
   
  楼上的方法没试,不过可以参考!  
 

NO.9   作者: abc3000

mark

NO.10   作者: sxqwhxq

在Ontimer事件中分配内存不是明智的做法


    摘要: vb中怎么调用? 并且因为通用性问题怎么使别人也能用,把自己的宏一起copy过去?宏放在哪个目录里的? ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE