delphi源码中freeandnil写法问题 ( 积分: 20 )

  • 主题发起人 主题发起人 hitcc
  • 开始时间 开始时间
H

hitcc

Unregistered / Unconfirmed
GUEST, unregistred user!
源码中FreeAndNil写成:
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
这里用局部变量Temp指向Obj,先把Obj置空,再free Temp这个局部变量。
为什么不直接写成
procedure FreeAndNil(var Obj);
begin
TObject(Obj).Free;
Pointer(Obj) := nil;
end;
呢?不解
 
先执行Free语句,会将对象从内存中清除,从而会导致Pointer(Obj) := Nil语句出错。
 
怎么叫清除? free调用destroy释放对象占用的内存空间 访问Obj指向的内存当然会出错 但Pointer(Obj) := nil;是把Obj这个指针置为空指针,也就是说让Obj这个指针不指向任何内存空间,怎么会出错?
 
Free是释放,但指针还是指向那个位置的(迷途指针)
二楼说的不对
 
var
obj : TObject;
begin
try
FreeAndNil(obj);
except
end;
if assigned(obj) then showmessage('obj <> nil');
end;

var
obj : TObject;
begin
try
obj.Free;
obj := nil;
except
end;
if assigned(obj) then showmessage('obj <> nil');
end;
 
楼上的想说什么? 你的对象根本就没创建 怎么就去操作呢?
 
var
btn : TButton;
obj : TObject;
begin
btn := TButton.Create(self);
obj := btn;
btn.Free;
try
FreeAndNil(obj);
except
end;
if assigned(obj) then showmessage('obj <> nil');
end;

var
btn : TButton;
obj : TObject;
begin
btn := TButton.Create(self);
obj := btn;
btn.Free;
try
obj.Free;
obj := nil;
except
end;
if assigned(obj) then showmessage('obj <> nil');
end;
语法没规定对象没创建就不能操作了,像类方法就能不创建对象就直接调用,而不会出错.
我想说明的是,FreeAndNil可以保证对象为Nil,而不管Free出不出错
 
var
obj : TObject;
begin
try
FreeAndNil(obj);
except
end;
if assigned(obj) then showmessage('obj <> nil');
end;
像这样,参数根本传不进去的。类方法是通过类来操作,而不是通过没被创建的对象操作,没被创建的对象怎么操作?

下面的两个例子obj和btn指向的是同一块内存空间,btn.Free;以后,obj是没法再free的。

我的问题是,源码中FreeAndNil写成:
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
为什么多用一个局部变量Temp
 
>>类方法是通过类来操作,而不是通过没被创建的对象操作,没被创建的对象怎么操作?
type
TA = class
class procedure a;
end;

{ TA }

class procedure TA.a;
begin
showmessage('a');
end;

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
a : ta;
begin
a.a;
try
a.Free;
a:=nil;
except
end;
if assigned(a) then showmessage('a <> nil');
try
FreeAndNil(a);
except
end;
if assigned(a) then showmessage('a <> nil');
end;

我想说明的是,FreeAndNil可以保证对象为Nil,而不管Free出不出错
已经很明白了,用Temp是因为,如果Free出错,Obj还是nil,如果照你写的,Free出错,Obj就<>nil了
 
procedure TForm1.Button2Click(Sender: TObject);
这里面TA.a是可以的 a.a是会出错的
freeandnil那个了解了 谢谢啦
初学者 理解不深 :)
 
接受答案了.
 
后退
顶部