怎么释放内存?(100分)

  • 主题发起人 主题发起人 wqthai
  • 开始时间 开始时间
W

wqthai

Unregistered / Unconfirmed
GUEST, unregistred user!
看到别人的描述:
ADOConnection.Free
//释放对象实例
ADOConnection := nil
//释放对象所占用的资源
addquery.Free;
addquery := nil;
请教:
释放对象的实例(.Free),和释放对象所占的资源是什么关系?
有创建(Create),必须得有这两句吗?.Free 和 := nil
测试程序:
procedure TForm1.Timer1Timer(Sender: TObject);
var
AdoQuery: TAdoQuery;
begin
ADOQuery := TADOQuery.Create(nil);
end;
观察,任务管理器里的内存使用情况,不断增加中,
但把程序关闭后,内存占用恢复到启动程序前状态。请教:
是不是用delphi写的程序不用手工释放(即执行.Free 和 := nil),
也可以保证内存安全?
 
不可以保证.
凡是Create中的参数用nil的,都要手工释放.
如果不是,则不必手工释放.
 
释放类事例就是释放他占用的资源。加一个adoquery;=nil是为了这个对象指针可以
重复使用,(可以判断该类是否晴空了,和C的是一个道理)
当然EXE退出的时候操作系统会自动释放你所占的资源,但是如果你在EXE里不释放你
分配的资源,那么内存越来越少,最后可能出错
 
有创建,最好释放,不然……不好说
 
释放资源的好处是提高程序运行的效率。
试想程序运行的时候,你不断的Create而不Free,那么内存迟早会
用完,到时候程序就爬不动了。
 
環是create 要释放. 包括mdi child form
有些不能自動释放,要释放,不然會報地址錯誤
 
FreeAndNil
呵呵,并做一步
 
对象不会自己释放的,需要自己来,.Net中会好的多
 
AdoQuery 在delphi中实际只是一个指针,

ADOQuery := TADOQuery.Create(nil)
后,
它指向一个 TAdoQuery 实例了,
在子程序结束时,Delphi只将ADOQuery这个指针所在的4字节释放,
而不会释放它指向的实例,所以导致内存增加。
 
谢谢各位的回答!我在理解一下大家的说明:
不论是Create(nil)还是Create(aParent)创建的对象,不用手工Free,也是
安全的!因为:“当然EXE退出的时候操作系统会自动释放你所占的资源”

to LiChange:
凡是Create中的参数用nil的,都要手工释放.
如果不是,则不必手工释放. ---为什么就不用手工Free呢?

to地瓜:有些不能自動释放,要释放,不然會報地址錯誤
---- 哪些不能自动释放?那些又能呢? 为什么?
 
因为Create中的参数是你新建的东东的Owner,你的owner释放时会把他释放的,所以不用你操心了.
 
FreeAndNil(obj);
obj.owner=nil
 
原来遇刺!
 
to LeeChange:
那为什么用nil创建的对象,
exe退出后,内存还可以被安全释放呢?是不是这句话是正确的?
“当然EXE退出的时候操作系统会自动释放你所占的资源”

to DarwinZhang:
问题是程序退出后,内存没有增加啊!!
 
to wqthai:
这是因为对象毕竟也是application申请的一块内存,
当application结束时,它申请的一切内存都会被windows操作系统释放掉,
所以程序退出后,内存不会增加。
 
多人接受答案了。
 
后退
顶部