关于FreeAndNil的用法

Fly_away_2001 2004-01-10 12:01:07
在一个SHOW的窗体CLOSE的事件中,
用FreeAndNil(窗体);时,报错
如果用 Action:=CanFree;
Form:=nil;
就不会错,
能否详细说说,谢谢
...全文
181 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZhuJiaWei 2004-01-11
  • 打赏
  • 举报
回复
经典。
Fly_away_2001 2004-01-11
  • 打赏
  • 举报
回复
还有人要补充吗?准备结贴了
ly_liuyang 2004-01-10
  • 打赏
  • 举报
回复
agui(阿贵 as 光明山人
正确的

Form:=nil;
Form.free;
是没有意义的,Nil没有Free的,执行上不会出错,但Form的真实对象没有被释放的
这样地导致内存漏洞的
Fly_away_2001 2004-01-10
  • 打赏
  • 举报
回复
漏了一句,
Form:=nil;
Form.free;

也没有问题,
<quote>
在事件后还有很多代码需要窗体对象。</quote>
是指系统的调用吗?
luckaguan 2004-01-10
  • 打赏
  • 举报
回复
up
光明山人 2004-01-10
  • 打赏
  • 举报
回复
FreeAndNil(窗体): 在事件中不能销毁,因为事件是在消息处理中调用的,在事件后还有很多代码需要窗体对象。

Action := CanFree: 告诉窗体的事件处理方法,在消息处理结束后销毁窗体对象;
Form:=nil:仅仅是将一个变量置为空指针,但对象并没有被销毁。
zyxg 2004-01-10
  • 打赏
  • 举报
回复
学习!
dickeybird888 2004-01-10
  • 打赏
  • 举报
回复
还有不清楚的吗?
哈哈
dickeybird888 2004-01-10
  • 打赏
  • 举报
回复
借鉴一下高手的说法吧:
procedure TObject.Free;
asm
TEST EAX,EAX
JE @@exit
MOV ECX,[EAX]
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
@@exit:
end;
Free= if Object is not nil then destory else do nothing.
在destory之后,对象所占用的空间被释放了,但是对象变量的值(就是指向对象实例空间的指针)
并没有被清空,如果对同一个对象进行两次Free,就极可能发生内存访问错误。

下面是一个例子:
procedure TForm1.q34(Sender: TObject);
var
a:TStringList;
begin
a:=TStringList.Create; //对象获得实例空间
//a.Free; //1
FreeAndNil(a); //2 如果让1有效而2无效,则会在3处出先非法内存访问错误,因为此时
//a所指向的内存已经不再属于对象
a.Free; //3
a.Destroy; //出错——试图释放一个空对象
end;

delphiseabird 2004-01-10
  • 打赏
  • 举报
回复
漏了一句,
Form:=nil;
Form.free;
你的这句free的并不是原来的form指向的那个窗体了,因为你调用了Form:=nil;使程序与这个窗体的内存失去了联系-“内存泄漏”
正确的释放方法就像楼上的所说。
不知道我说的对否
haipin 2004-01-10
  • 打赏
  • 举报
回复
Free方法不会自动把对象设为Nil,所以在调用Free后最好手动把对象设为NIl,做到这一点的一个简单方法是调用FreeAndNil过程。
globalVar:=TNewClass.create;
try
Globalvar.over;
finally
FreeAndNil(globalvar);
end;
Hedonism 2004-01-10
  • 打赏
  • 举报
回复
UP
Fly_away_2001 2004-01-10
  • 打赏
  • 举报
回复
那该怎么样才是真正的释放掉了呢?
谢谢
{ 工作中遇到这样的需求,苦苦找不到相关的代码,找到一个还是收费的!:( 本着共享互惠的精神,本人简单实现了一个 FastReport 打印二维码的应用。 使用方法非常简单,将压缩包中的 frx2DBarcode 单元添加到引用即可在报表设计中看到 2D 条码对象,进行设计、打印。 目前仅实现了 QRCcode 的打印,抛砖引玉,相信增加 PDF417,DM 编码应该不会太难。 如果对源代码做了改进和修改欢迎 EMAIL 给我一份,学习一下! 邮件: JulyXDay@QQ.COM 谢谢支持! } {******************************************} { } { FastReport v4.0 } { 2DBarcode object } { } { Copyright (c) 2012 } { by LiKejian } { QQ 39839655 } { } {******************************************} unit frx2DBarcode; interface {$I frx.inc} uses Windows, Messages, SysUtils, Classes, Graphics, frxClass {$IFDEF Delphi6} , Variants {$ENDIF}; type TfrxBarcode2DObject = class(TComponent); // fake component TfrxBarcode2DView = class(TfrxView) private FEccLevel: SmallInt; FModule: SmallInt; FVersion: SmallInt; FText: String; FExpression: String; public constructor Create(AOwner: TComponent); override; procedure Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended); override; class function GetDescription: String; override; procedure GetData; override; published property Version: SmallInt read FVersion write FVersion default 0; property EccLevel: SmallInt read FEccLevel write FEccLevel default 0; property Module: SmallInt read FModule write FModule default 0; property DataField; property DataSet; property DataSetName; property Expression: String read FExpression write FExpression; property Frame; property Text: String read FText write FText; end; implementation uses frx2DBarcodeRTTI, frxDsgnIntf, frxRes, frxUtils, uQRCode; constructor TfrxBarcode2DView.Create(AOwner: TComponent); begin inherited; end; class function TfrxBarcode2DView.GetDescription: String; begin Resul

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧