关于free,destroy的问题?(100分)

  • 主题发起人 主题发起人 xiao_mei
  • 开始时间 开始时间
X

xiao_mei

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中创建了一个tcientsocket的对象client
在最后采用
client.close;
client:=nil;
client.free;
来释放。
我的程序是需要不断的创建和释放该对象的,
但我在winnt的任务管理器中发现内存的使用是不断的增加的,根本没有释放出来。
后来我采取了如下的过程:
client.close;
client.destroy;
client:=nil;
client.free;
内存使用在增加了到一定的程度,会释放出来。而且内存使用的增加速度慢很多。
我的程序运行了一个晚上都没问题。
我不明白为什么在采用第一种情况不会释放内存?
我看了帮助文件,他是建议最好用free而不是destroy的,
现在我想建一个tadoquery的对象连接access数据库,
不知道采用第二种方法释放对象,会不会对数据库造成影响?
 
应该使用
client.close;
client.free;
或者
client.close;
client.destroy;
client:=nil;
也可以。
这样才能释放
 
你的释放顺序错了。
; 在Delphi中,对象实际上就是指针。在client:=nil之后,对象指针client已经与它原来所指向的实例内存
脱离了关系,在其后再行Free是毫无意义的。

应该这样做:
client.close;
FreeAndNil(client); //相当于 client.free; client:=nil;
 
同意楼上
 
client.free;等同于if not client=nil then client.destroy;
一般这样用:client.free;client:=nil;这样避免再次free时发生地址访问错。
照creation-zy说的没错。

最小心的做法是:

if client=nil then client.create(); ;//只要对象free跟:=nil成对出现,初值为nil,这样总是对的而且是安全的。
; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;//可以阻止对已创建的对象再次创建,造成内存泄漏。
//do something
client.free;
client:=nil;
 
>最好用free而不是destroy的
; 是的,你可以看一看VCL的源代码,Free和Destory的区别就在于:Free过程首先判断对象是否为0(Nil),
如果是,则表示没有对象需要被释放,立即返回;否则,就调用Destory过程。
; 如果简单的使用Destory,就可能发生释放nil对象的错误。
; 但是Destory过程在释放完对象的实例空间之后,并不将对象指针置为nil,从而有可能导致两次释放同一个
对象的错误,因此,最保险的方法就是用FreeAndNil过程,它在Free对象之后自动将对象指针置为nil,这样,
就算再次释放同一个对象,也不会产生错误了。
 
多人接受答案了。
 
后退
顶部