用try finally end 去处理,需要释放的都放在finally end之间

解决方案 »

  1.   

    function TShttp.getpipei(url:string;url2:string):k;
    var
       rex : TRegex;
       pipei:TMatch;
       pipei2:TMatchCollection;
       a,i,p,x:integer;
       idhttp1:Tidhttp;
       url_two:string;
     begin
       idhttp1:= Tidhttp.Create(nil);  
       try
         code:=idhttp1.Get(url);         
         rex:=TRegex.Create(zhengze);
         try
         pipei:=rex.Match(code);
         finally
           rex.Free;       //   还有这个,     是不是应该在这里释放???
         end;
      finally
        idhttp1.Free;  //        是不是应该在这里释放???
      end;
    end;
      

  2.   

    function TShttp.getpipei(url:string;url2:string):k;
    var
      rex : TRegex;
      pipei:TMatch;
      pipei2:TMatchCollection;
      a,i,p,x:integer;
      idhttp1:Tidhttp;
      url_two:string;
    begin
    try
      idhttp1:= Tidhttp.Create(nil);  
      code:=idhttp1.Get(url);         
     
      rex:=TRegex.Create(zhengze);
      pipei:=rex.Match(code);
     
    finally
     idhttp1.Free;  //        是不是应该在这里释放???
    rex.Free;       //   还有这个,     是不是应该在这里释放???
    end;
    end;try  finally  能不能这样写? 把要free的都放到 一个finally 中哦? 要不然要写很多 try finally 吧
      

  3.   

    create要放到try上面.不用try finally 都可以,只是怕try..finally之间的代码报异常,确保finally..end之间的代码能执行。
    如果create也在try..finally里头,万一create失败报异常,那free也会执行,那样就会free一个不存在的对象,就错上加错了。
      

  4.   


    比如 idhttp1 free 之后,该方法下面的代码又要使用idhttp1,这时 idhttp 需要重新 create 一次吗?
      

  5.   


    比如 idhttp1 free 之后,该方法下面的代码又要使用idhttp1,这时 idhttp 需要重新 create 一次吗?
    可以重新 create。这种情况也可以把idhttp1声明成你的类的成员变量,在类的create和destroy中创建idhttp1和释放idhttp1,这样类的所有方法都用同一个idhttp。
      

  6.   

    还有一个问题,就是record 的类型的实例,有Create 构造函数,却没有free 方法, record 的类型的实例需要释放吗?又如何释放呢啊?
      

  7.   

    tryfinallyend;
    record本身不需要释放,record里面的成员对象需要释放