第一个问题:
Function TA.Myfree:boolean;
begin
 self:=nil;           
end;
这应该是非法的,但也能运行,好像self:=nil也没有作用,能解释一下吗第二个问题:
function Ta.myfree:boolean;
begin
 result:=true;
 free;
end; 
这样写还能将result传出,这样写合不合法,对象实例有没有正确释放第三个问题:
  TA=class
  public
    procedure clear(b:Tb);
  end;  TB=class
  public
    parent:TA;
    procedure myfree;
  end;procedure Ta.clear(b:tb);
begin
b.Free;
end;procedure Tb.myfree;
begin
parent.clear(self);
end; 这样写应该是没有问题的吧

解决方案 »

  1.   

    --------------------------------
    1、这是合法的,self是个指针,当然能nil,但设为nil不一定释放了内存。
    设为nil的作用是你可以用Assigned函数判断这个指针是否有效。2、对象的Free方法实际就是一个过程,如果Free方法有效的话,就能正确释放。3、有问题,不符合类的用法,应该自己有自己的释放方法。3、好象还没有人这样用的。之所以用类,就是为了更好的封装,你这样违背了类的根本原则。
      

  2.   

    miky你的观点我不敢苟同
    1、这是合法的,self是个指针,当然能nil,但设为nil不一定释放了内存。
    设为nil的作用是你可以用Assigned函数判断这个指针是否有效。
    /////////////////////////////////
    照你这么说,那么
    Function TA.Myfree:boolean;
    begin
     self.free;(或就写free)
     self:=nil;           
    end;
    .........
    a,b:ta;
    ......
    a:=ta.create;
    b:=a;
    a.myfree;
    按照你的说法,a,b都为nil了,实际上都不为nil, self:=nil根本没有作用
    2、应该能正确释放
    3、我这么些违背封装原则了,而实际上我真是将两个相似的类封装起来,为了实现多态,而这样编写释放语句。我认为这么任何问题,实际上测试也没有问题
      

  3.   

    Function TA.Myfree:boolean;
    begin
     self:=nil;         
    end;这里的self只是一根指针,对象a也是指针,a.Myfree的时候将a的值传递给了self,于是a和self指向同一个对象,但这是传值调用,你把self:=nil 这对a是没有影响的!
    好好想一下C中的指针。
      

  4.   

    NewStarSE说的极有道理,令我茅塞顿开,就是这个原因
      

  5.   

    哦~~~~~~~~~~~那你就是说Self是指向TA的指针了?我觉得应该是这样!但是作为函数这样写是不是会有问题的啊?
      

  6.   

    关于第二个问题,我的理解实在delphi中如果函数没有任何标记,默认是静态方法,所以结果可以传出去。