局部定义的对象变量是否要写代码来释放??(50分)

  • 主题发起人 主题发起人 kem
  • 开始时间 开始时间
K

kem

Unregistered / Unconfirmed
GUEST, unregistred user!
请问,在过程内定义的局部对象变量(如:IniFile : TIniFile;),请问,在过程最后处要释放该变量吗??
用:IniFile.Free;还是IniFile : = nil;还是两句都要写???各有什么区别呢???
多谢!!

 
应该释放;
用IniFile.Free;
 
agree 卷起千堆雪tyn
 
写一句就行,估计free也是调用:=nil,所以free也许开销大些(瞎猜的[:)])
 
肯定要释放;
IniFile.Free;
 
若你在后面不再引用这个变量,用Free就行了,若你在这个过程内怕在后面
引用出问题,可再加上NIL。
 
释放资源是程序员应该牢记的问题,呵呵,否则,会发现内存1G都不够快:)
 
一定要free
 
IniFile.Free;
 
最好用
freeandnil(变量)
 
同意qiandeng,
freeandnil(指针)
等价于:
obj.free;
obj := nil;
查帮助因该就可以看到,为什么Delphi中有时候对指针free后还要将其清0(赋为nil)。
 
凡是Create的,一定要释放。
如果是生存期自管理的,可以不用管,如string, 动态数组等等,也可以赋为nil
控件型的,有parent对象的,parent释放时会同时回收。如直接添加的控件
直接free是安全的,赋为nil就更安全些,因为释放一个空指针是没有问题的,但是同时
也带来一个副作用,就是当没有被释放时,如果是访问超过边界,访问到这一段内存时,
会弹出一个AV异常,但是如果它被赋为nil,就不会了,虽然访问仍然是非法的
 
并不是所有Create都必须Free:

当你动态创建一个Button,如果你需要把它显示出来(不要说你创建了一个Button不需要显示出来用),
必须为其把定一个Parent,或者ParentWindow,而这个Parent会自动地Free掉它的子控件,所以这个
Button不需要Free,如果你Free了,那么在Free它的Parent时反而会出错。
从TWinControl继承下的控件都是这样的!
 
procedure TForm1.Button1Click(Sender: TObject);
begin
with TButton.Create(Self) do
try
Parent := Self;
Update;
Sleep(1000);
finally
Free;
end;
end;
在指明了Component的Owner后,其owner将负责在Free时Free其拥有的Component
但并不是说设置了Owner之后你就不能手动Free它了。
 
TO kem:
  一般原则是你自己创建或显式申请(GetMem,New...)的内存,在用完之后都得手动释放它。
IniFile.Free;是把IniFile这个对象Free掉
IniFile : = nil;只是把IniFile变量设为nil,但并没有释放其创建时占的内存。
因为是局部变量,Free后就再不会用IniFile去访问它,所以也无需把它设为nil.
 
我的感觉是释放比较安全,虽然系统回自己释放局部定义的对象变量
不过为了程序的健壮,最好是这样
try
//代码
finally
//释放
end;
否则一旦出现异常,不知是否回自动释放?


 
agree with xianjun,
 
to xianjun
你说把initfile变量设为nil,并没释放内存,是指没有调用free的情况吧。
申明一个变量,就是创建一个指针,好像是个32位整数,应该不占系统资源
 
Well:
with TIniFile.Create('file.ini') do begin
Str := ReadString('SEC','Indent','Defalt');
...
end;
>>How to free it?
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部