SomeClass1 := TSomeClass.Create;
SomeClass2 := TSomeClass.Create;
try
  { do some code }
finally
  SomeClass1.Free;
  SomeClass2.Free;
end;

解决方案 »

  1.   

    当然完全了,这是delphi帮助里面推荐使用的方法啊
      

  2.   

    SomeClass1创建成功以后,SomeClass2的创建出现异常,就会导致SomeClass1没有释放就退出过程...一家之言...
      

  3.   

    标准应该是下面这样:
    SomeClass1 := TSomeClass.Create;
    try
      { do some code }
      try
        SomeClass2 := TSomeClass.Create;
      finally
        SomeClass2.Free;
      end;
    finally
      SomeClass1.Free;
    end;
      

  4.   

    如果非要说有问题的话,我建议把SomeClass2和SomeClass1的释放顺序颠倒一下,如果你的程序中SomeClass1和SomeClass2 有关系的话
      

  5.   

    赞成 zzlingaaa(小舟)  hqhhh(枫叶)
      

  6.   

    zzlingaaa(小舟):看看finally的帮助再说,finally是遇到异常后执行的。怎么会中断
      

  7.   

    呵呵,作了各种测试,finally里面的free出现异常的情况只有一种,就是在执行finally的free时候SomeClass1已经被free了。谁写程序会那么写?趁早该行吧!
      

  8.   

    一般情况下楼主那样的写法就没问题的了,但是如果是自定义的类、create和free方法重载或者重写过的话,如果考虑到create或者free方法也有可能出现异常,最好能做相应的控制
      

  9.   

    支持hqhhh(枫叶),不论在什么情况下都能释放SomeClass1和SomeClass2。
      

  10.   

    如果需要创建10个class,岂不是要嵌套10层try?搞笑
      

  11.   

    SomeClass1 := TSomeClass.Create;
    try
      { do some code }
      try
        SomeClass2 := TSomeClass.Create;//如果构造函数抛出异常,将调用析构函数,这样做还是不安全
      finally
        SomeClass2.Free;
      end;
    finally
      SomeClass1.Free;
    end;
      

  12.   

    //写一个例子,有兴趣的看一下type
      TTest = class
        constructor Create;
        destructor Destroy;override;
      public
        procedure Test1;
      end;constructor TTest.Create;
    begin
      inherited;
      raise Exception.Create('Create');
    end;destructor TTest.Destroy;
    begin
      raise Exception.Create('Destroy');
      inherited;
    end;procedure TTest.Test1;
    begin
      raise Exception.Create('Test1');
    end;
    ///////////////////////////////////
    //测试
    var
      T: TTest;
    begin
      TTest.Create;//这里将调用Destroy,后面的都没有执行
      try
        T.Test1;
      finally
        T.Free;
      end;
    end;
      

  13.   

    SomeClass1 := TSomeClass.Create;
    try
      { do some code }
      try
        SomeClass2 := TSomeClass.Create;
      finally
       if assigned(SomeClass2) then
        SomeClass2.Free;
      end;
    finally
      SomeClass1.Free;
    end;