基础问题,在一个类中如何释放自己? 我在一个类的方法中用self.free释放自己,可是稍后用assigned 检查,仍然为true,而它的成员变量仍然能访问,怎么回事? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 个人认为,在类的成员函数中释放自己是不安全的代码。它的释放代码应该在destroy中。 我也yjs_lh(长风浪子)的看法,标准的做法是将资源释放的代码放在析构函数中,对某个类实例的释放,应该调用该实例的free方法。例如:var frmChild: TForm;frmChild := TFrom.Create(nil);try frmChild.ShowModal();finally frmChild.Free(); frmChild := nil;end;另外,用assigned检查某个已释放的类实例并不正确,必须在释放是将该实例置为NIL。即使该实例已经释放,如果没有将实例指针置为空,则指针所指内容为随机,有可能有内容,也有可能没内容,在c中被称为空悬指针。 单纯的FREE并没有将指针置NIL;用函数FREEANDNIL看看你就知道了; 释放后,类的实例的指针并没有赋值为nil,自然assigned返回true。你可以试试:labe1.free;if assgined(label1) then showmessage('true'); 其实很简单的道理,证明:varLabel1, Label2: TLabel;beginLabel1 := TLabel.Create(self);Label2 := Label1;//两个变量指向同一个对象。Label1.Free();//释放这个对象//Label2一定不是nil,自然你也不能要求Label1是nil.end; 为什么释放自己是不安全的做法呢?是因为释放后不能将自己置nil吗? Object.Free后,Object<>nil。因为Object是一个指针,Free只是清除指针指向的数据。另外,最好不要在类或者实例中释放自己。因为这可能会有一些不安全的问题。—————————————————————————————————宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。————————————————————————————————— 查了一下,VCL的源码里清除自己就是调用自己的Destroy方法,唉,我真笨 我的一个DLL函数,可以在DEPHI中调用,却无法在VB或VC中调用,为什么? 怎样在DEPHIL 7中统计中文字数? 用fastreport打印的问题。 vc开发的activex中的事件在delphi中无法正常使用? 交换友情链接 窗口消息问题 请问??先谢了 :) 高分求教!!如何用 Delphi 制作打开/创建文件对话框? 如何读(保存)???? DELPHI 创建的系统服务,调用另一个模块的ADOCONNECTION控件报地址错 如何使程序不出现在任务列表中? 类型转换的问题 救命!!!!
var frmChild: TForm;
frmChild := TFrom.Create(nil);
try
frmChild.ShowModal();
finally
frmChild.Free();
frmChild := nil;
end;
另外,用assigned检查某个已释放的类实例并不正确,必须在释放是将该实例置为NIL。
即使该实例已经释放,如果没有将实例指针置为空,则指针所指内容为随机,有可能有内容,也有可能没内容,在c中被称为空悬指针。
用函数FREEANDNIL看看你就知道了;
你可以试试:labe1.free;if assgined(label1) then showmessage('true');
var
Label1, Label2: TLabel;
begin
Label1 := TLabel.Create(self);
Label2 := Label1;//两个变量指向同一个对象。
Label1.Free();//释放这个对象
//Label2一定不是nil,自然你也不能要求Label1是nil.
end;
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————