我想问一下:
try
....TT:=TStringlist.Create;
   语句1;
finally
... TT.Free;
end;
其中TT一定会释放吗?如果在语句1中发生异常的话,还要执行fianlly使TT释放吗?
还是应该这样些比较保险呢(如下)
try 
  try
    ....TT:=TStringlist.Create;
  except
    ... TT.Free;
  end;
finally
  ... TT.Free;
end;

解决方案 »

  1.   

    try
    ....TT:=TStringlist.Create;
       语句1;
    finally
    ... TT.Free;
    end;
    应该会释放,你可以单步跟踪一下。
      

  2.   

    最保险的应该是:
    try
    ....TT:=TStringlist.Create;  //如果创建时异常则退出,不会触发free
    except
      Exit;
    end;
    try
       语句1;  //不管此句是否异常,运行完毕后都会触发free从而释放资源
    finally
    ... TT.Free;
    end;
      

  3.   

    你的第一种写法,只要保证....TT:=TStringlist.Create;没有异常就可以了。
      

  4.   

    只要你不再Try中执行Exit或类似goto语句等功能的代码,那么你try部分的程序执行完之后 ,不论是否出现异常,都会执行finally语句。
      因此,你不必用第二中写法去写程序代码,第二种写法如果出现异常的时候,将会出错!没有哪个对象再Free之后还能再Free的。
      具体情况,你自己调试的时候跟踪一下看看就可以。或者去故意制造个异常,看看执行结果,就明白我说的情况了。
      

  5.   

    请教 zzllabc(转ERP中...) :如果用
    try
    ....TT:=TStringlist.Create;
       语句1;
    finally
    ... TT.Free;
    end;
    的话在TT:=TStringlist.Create;处创建时出错。那末在finally里free也会出错吧?
      

  6.   

    TT一定会释放
    try……end 异常处理结构用于对系统资源的保护,它能保证一些必要的代码在异常发生时仍能被执行。它的语法格式如下:
      try
        受异常保护的代码段;
      finally
        必须执行的代码段;
      end;不管try与finally之间的程序是否发生异常,finally与end之间的代码段都会被执行。
      

  7.   

    free方法是先检测对象是否为nil,然后再调用destroy方法的啊
      

  8.   

    楼上的是说free两次也不会出错。只是第二次不执行了?还是free时检测到对象为nil,就引发一个异常?
    恩,去做个实验。