请教一个关于对象销毁的问题?(20分)

  • 主题发起人 主题发起人 doglive
  • 开始时间 开始时间
D

doglive

Unregistered / Unconfirmed
GUEST, unregistred user!
一个类:
TA = class(TObject)
public
i : integer ;
procedure sh;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a ,b: TA ;
begin
a := TA.Create ;
b := a ;
a.i := 10 ;
a.Free ;
a := nil ;
b.i := 2 ;
//b.Free ;
b.sh ;
end;
以上代码可以正确的运行,现在的问题是,a和b是同一个对象,,我既然用 a.free销毁了对象,为什么还可以用b.sh方法呢》?? 但是又不能调用b.free了,,一调用就会出错
 
很好,问题问的有意思,刚好有所想法,就最先告诉你吧:
1.大家都知道,这个时候b是一个悬空指针!b<>nil
2.b.Free调用的是TObject.Free方法,其实现为:
if Self <> nil then
Destroy;
也就是说,Self = b <> nil ,那么会调用Destroy方法,一般Destroy中都有FreeMem之类的方法,内存管理器会报错。
3.b.sh为什么不错?!b.sh在编译的时候,就直接将函数指针计算出来了!因为函数指针是一定的,不一样的只是Self指针的传入!
其实这个只是凑巧,虽然你的sh方法的实现没有贴出来,但是可以肯定的是,其没有使用类成员!否则一样报错。而正因为没有使用类成员,所以b.sh的代码执行说访问的内存空间都是安全的!

对有对的理由
错有错的原理
 
接受答案了.
 
后退
顶部