首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于Create(nil)引发的自释放与手动释放有关问题

2012-03-05 
关于Create(nil)引发的自释放与手动释放问题大家觉得是用Create(),等宿主帮释放好还是用Create(nil)自己释

关于Create(nil)引发的自释放与手动释放问题
大家觉得是用Create(),等宿主帮释放好还是用Create(nil)自己释放好呢?

[解决办法]
我一般这样:

构造局部对象时, 作用域很明确地局限于过程内部的, 可以使用AOwner=nil :

with TComp.Create(nil) do
try
//...
finally
Free;
end;

即使是动态创建的局部对象, 如果其作用域不仅仅限于过程内部, 那最好用AOwner <> nil

------不知我的理解对不对.
[解决办法]
用代码Create出来的控件,
最好是自己释放
这样一来每一个Create都有一个Free对应,
一是代码阅读起来比较容易些
再就是写一些没有Owner的对象时,不容易出错
有Owner就像是有双保险,偶尔忘了free时,也不怕内存泄漏

可能有人会说这样很死板,
但在团队开发时,为了不使新手困惑,这点死板是有必要的
[解决办法]
呵~~,看你应用的环境与使用习惯了。

一般地,动态创建的对象,支持程序员自己释放其内存,且常用的固定模式为:
1.利用类方法,在未定义类对象变量时创建类实例
with TAClass.create(nil) do
try

finally
free;
end;
2、定义了类对象变量时:
var
a:TObject;

a:=tobject.create(nil);
try

finally
freeandnil(a);
end;

在动态库中创建全局的动态对象时,多为属主为NIL的情况,此时,在DLL的出口处一定要释放内存!且应当作安全检查后释放。
if assigned()then
freeandnil()
[解决办法]
使用Nil效率比较高,如果用带Owner的还要触发通知函数(通知函数是一个递归函数)
具体见刘艺书

热点排行