关于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的还要触发通知函数(通知函数是一个递归函数)
具体见刘艺书