第一个问题:
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; 这样写应该是没有问题的吧
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、这是合法的,self是个指针,当然能nil,但设为nil不一定释放了内存。
设为nil的作用是你可以用Assigned函数判断这个指针是否有效。2、对象的Free方法实际就是一个过程,如果Free方法有效的话,就能正确释放。3、有问题,不符合类的用法,应该自己有自己的释放方法。3、好象还没有人这样用的。之所以用类,就是为了更好的封装,你这样违背了类的根本原则。
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、我这么些违背封装原则了,而实际上我真是将两个相似的类封装起来,为了实现多态,而这样编写释放语句。我认为这么任何问题,实际上测试也没有问题
begin
self:=nil;
end;这里的self只是一根指针,对象a也是指针,a.Myfree的时候将a的值传递给了self,于是a和self指向同一个对象,但这是传值调用,你把self:=nil 这对a是没有影响的!
好好想一下C中的指针。