如何知道一个对象是否已经安全从内存释放? (100分)

  • 主题发起人 主题发起人 autumn
  • 开始时间 开始时间
A

autumn

Unregistered / Unconfirmed
GUEST, unregistred user!
如果是一个我自定义的Object,那么我可以加上一些测试代码,确定它已经释放了
type
TEmpObj=class
private
...
public
...
destructor Destory;override;//加上去测试用
end;
.....
implementation
....
destructor Destory;
begin
inherited;
showmessage('我被安全释放了');//我可以写这样的东西确定已经安全释放
end;

但是如果是一些TabSheet,或其他什么东西,我怎么确定它已经释放了?
procedure TForm1.Button1Click(Sender: TObject);
var
tab1: TTabsheet;
begin
tab1 := TTabsheet.Create(self);
tab1.Caption := '新页面';
tab1.PageControl := PageControl1;
end;
我如何确定我这个tab1能正常释放内存?怎样debug?
或则
var
ss:^integer;
begin
new(ss);
...
//这里我没有dispose(ss);
end;
怎么知道ss是否已经释放了?
 
可以用Assigned()函数检测
如:if assigned(ss) then ss.free
 
请看代码:
...
form1:=tform1.create(nil);
...
form1.free;
if assigned(form1) then showmessage('aaa');//这里好像会显示sss的
 
用assigned就行了,帮助中有的。
 
如果要完全释放,要用FreeAndNil.
Free是释放该对象占有的内存;
Nil将指向这个对象的指针设为nil.
Assigned是判断指向这个Form的指针是否为nil的.
也就是说虽然Form占有的内存已经释放,但是其引用的指针还未赋值为nil,所以
assinged(Form1)为True,但是如果你去用这个Form1的话,就会出错.
例如
form1:=tform1.create(nil);
...
FreeAndNil(form1);
if assigned(form1) then showmessage('aaa');//绝对不会出现'aaa'
 
同意 bluerain !
 
对象是你自己free的,你写程序的时候应该知道的
 
Form.Free并不会赋值为nil
Form.FreeAndNil
 
呵呵,问了一个蠢问题,快快结束了
 
后退
顶部