比如 
var tempstrlist:tstringlist;//或者Tlist或者TIdCompressorZLibEx或者其他
begin
   tempstrlist:=tstringlist.Create;
   try
     tempstrlist.Add('dd');
   finally
       //这里不free
   end;
end;
   这样做有什么后果吗?有人说delphi会自动处理释放的问题。
   是这样的么?如果线程里面大量的tstringlist 不free 会导致系统崩溃么?目前有一个问题:有一个测试的电脑在操作WebBrowser加载网页出现了程序异常,然后程序就没了。
我想问是不是和内存有关系呢?

解决方案 »

  1.   

    你这里的代码要free掉,不free的话,会造成内存泄漏,严重的会系统崩溃因为Create后已经分配了内存空间,若不释放,系统会认为你一直在使用它,也就不会再分配这个地址空间给别的程序,这就造成了内存泄漏
    当然现在的计算机内存都很大,不释放暂时没啥影响
    但随着Create次数越来越多,内存泄漏也越积越多,最终是会用完的,系统崩溃只是时间上的问题
      

  2.   

    继承自TComponent的VCL对象,在创建时如果指定一个有效的Owner,可以不考虑手工释放,Owner会负责。但是规范一点,本着谁创建谁释放的原则,我觉得手工添加Free的代码比较好。至于TStringList,它并不是从TComponent继承的,构造函数中也没有类似TComponet那样指定OWner,所以,TStringList在创建以后需要手工释放。我记的有某大牛曾说,就算内存泄露也没关系,进程结束时系统就回收内存了,这样是极不负责任的。
      

  3.   

    我在4楼的回复中有一处小笔误,"类似TComponet那样指定OWner" 应改为"类似TComponent那样指定OWner",特此更正。Delphi版藏龙卧虎,来不得半点马虎。
      

  4.   


    这里不free的话,你也可在以CLOSE事件中FREE也是可以的
      

  5.   

    原来delphi 对继承自TComponent的VCL对象 会负责自动释放的,不是对所以的对象。
       之前误解了我
      

  6.   

    造成大量内存空置。那么这样的话,使用程序时间越长是不是电脑的cpu 越高?
      也就是如何验证电脑内存空置???
      

  7.   

    另外我说的 一个问题 程序突然没了  这个是什么情况呢?
       出现了2次,都是同一个电脑,做同一个操作,就是用ebBrowser加载网页出现了程序异常,exe没了
      

  8.   

    webBrowser加载网页出现了程序异常,exe没了在你自己的电脑上加载网页的代码设断点查看啊,跟踪下看看哪出问题,或者贴代码出来