DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xiao2024
今日帖子: 17
在线用户: 11
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 diystar (diystar) ★☆☆☆☆ -
普通会员
2016/8/15 17:06:58
标题:
老生常谈:FreeAndNil和Release的必要性 浏览:1950
加入我的收藏
楼主: 1.一个全局变量,在窗口关闭(程序结束)时要不要使用FreeAndNil?还是Free就可以?
2.在窗口OnDestroy中,Self.Release有无必要?
----------------------------------------------
http://mcool.appinn.me/
作者:
男 diystar (diystar) ★☆☆☆☆ -
普通会员
2016/8/15 17:10:05
1楼: 都被内存读写错误弹窗搞怕了
----------------------------------------------
http://mcool.appinn.me/
作者:
男 zhangpuqing (pupu) ★☆☆☆☆ -
普通会员
2016/8/15 17:16:15
2楼: 理论上说变量不需要释放,只有对象才需要.
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2016/8/15 17:18:30
2楼: 1、如果是在程序结束时,不再操作什么的话,其实Free就够了。前一个只是相当于多了一个:=nil的步骤。。。。
2、窗口的Release一般不用调用。。。而且一般也不太用Destroy事件 。。。一般是在FormClose事件中写需要在窗口关闭释放前需要先处理的事情。。。
3、出现在关闭时的内存读写错误,多是窗体关闭了,但是有其它对象或内存分配的指针没有释放好。可以Debug一下,大部分还是很容易发现的。。。我一般用Euralog,简单的望一眼就知道,都不用Debug.
----------------------------------------------
-
作者:
男 diystar (diystar) ★☆☆☆☆ -
普通会员
2016/8/15 17:19:39
3楼: 嗯,我指的就是对象
----------------------------------------------
http://mcool.appinn.me/
作者:
男 diystar (diystar) ★☆☆☆☆ -
普通会员
2016/8/15 17:24:06
4楼: 第二点中,Self.Release应该放在OnClose中?网上看到,有人在OnClose中用了Self.Release,避免了一些内存读写错误弹窗..
----------------------------------------------
http://mcool.appinn.me/
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2016/8/15 17:30:33
5楼: 这种方法就算行也只能掩盖问题。。。。我认为是不对的。。。没听说窗体在Close还要手动Release自己,如果你想不报错,还不如在Close时直接处理完善后事宜后直接Terminate得了。。效果是一样的。。
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2016/8/15 17:32:18
6楼: 比如有时候程序退出的。。。httpclient还在卡死在读某个网络文件中,没来的及释放。。。。这时候我不想等。。就直接Terminate。。。当然你自己要确信,这个操作不影响你的程序的数据完整性才行。。
----------------------------------------------
-
作者:
男 diystar (diystar) ★☆☆☆☆ -
普通会员
2016/8/15 17:36:00
6楼: 这里找到一个EurekaLog的详细使用说明:http://blog.csdn.net/akof1314/article/details/6968587

以前没用它真是太可惜(尝试过,不会使用放弃了..)
----------------------------------------------
http://mcool.appinn.me/
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2016/8/15 17:40:19
7楼: 很简单的。。。不用用的太高深。。。。我也是简单用用。。。但是没它我不行,已经离不开了。。。。我一般只在出现问题时才需要调试开启的。。这样可以比较平衡。。。不然始终开启的话,每次编译会慢一会也不爽的。
----------------------------------------------
-
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2016/8/15 23:37:19
8楼: 怎么让eureka默认不自动开启呀,搞的一不小心提交的代码里就带上它的相关代码,经常导致别人编译不过
----------------------------------------------
18114532@qq.com
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2016/8/16 8:55:21
9楼: 内存读写错误都是过多的free造成的, 越是怕读写错误越增加free只会取得反效果

写少了free会造成的问题是内存泄漏

正确的程序free的数量只能是刚刚好一个不多一个不少, 这也就是难点所在

你应该追求的是每个变量自己都非常清晰什么时候分配内存而什么时候释放
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2016/8/16 9:28:06
10楼: 1.如果是全局变量,在主窗口关闭时,在主窗口的destroy里调用Free就可以了,不需要nil。程序都关了,谁还会引用它。

2.没有必要,delphi不建议手工调用release的。delphi建议重载destroy函数,在直接调用的时候用Free;

也就是如下的形式:
destructor destroy;override;


destructor TForm1.destroy;
begin
  ObjectneedFree.Free;
  inherited;
end;

假设有个f:TFrom1;
调用的时候用f.free; 不能f.release,也不能f.destroy;
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2016/8/16 9:39:22
11楼: 主要是要有套规矩。如果是第三方代码,通常不要主动释放第三方代码的对象里的属性/变量所代表的对象。如果发现第三方有内存泄漏,再主动释放第三方代码的对象。
自己的代码应该有一套自己的Free规则:在哪里,由谁来Free应该有自己的一套习惯。
比方,我们项目写代码时,通常都会在变量后面加ref以表明这个变量里的对象是引用的。通常不用后续的其他代码来Free。
另外在使用属性赋值对象时,赋值函数里往往是克隆操作(assign),而不是简单的:=引用。
----------------------------------------------
-
作者:
男 chscheese (chscheese) ★☆☆☆☆ -
盒子活跃会员
2016/8/16 13:28:25
12楼: 个人习惯:
静态创建,原生delphi对象实例使用完Free就好。
OLE、变体对象实例用完FreeAndNil
----------------------------------------------
-
作者:
男 diystar (diystar) ★☆☆☆☆ -
普通会员
2016/8/16 15:00:33
13楼: @jingtong 
Project>EurekaLog Options>Default 不要打勾
----------------------------------------------
http://mcool.appinn.me/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行125毫秒 RSS