|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2016/8/15 17:06:58 |
标题: |
老生常谈:FreeAndNil和Release的必要性 |
浏览:1950 |
|
加入我的收藏 |
楼主: |
1.一个全局变量,在窗口关闭(程序结束)时要不要使用FreeAndNil?还是Free就可以? 2.在窗口OnDestroy中,Self.Release有无必要?
----------------------------------------------
http://mcool.appinn.me/ |
作者: |
|
2016/8/15 17:10:05 |
1楼: |
都被内存读写错误弹窗搞怕了
----------------------------------------------
http://mcool.appinn.me/
|
作者: |
|
2016/8/15 17:16:15 |
2楼: |
理论上说变量不需要释放,只有对象才需要.
----------------------------------------------
-
|
作者: |
|
2016/8/15 17:18:30 |
2楼: |
1、如果是在程序结束时,不再操作什么的话,其实Free就够了。前一个只是相当于多了一个:=nil的步骤。。。。 2、窗口的Release一般不用调用。。。而且一般也不太用Destroy事件 。。。一般是在FormClose事件中写需要在窗口关闭释放前需要先处理的事情。。。 3、出现在关闭时的内存读写错误,多是窗体关闭了,但是有其它对象或内存分配的指针没有释放好。可以Debug一下,大部分还是很容易发现的。。。我一般用Euralog,简单的望一眼就知道,都不用Debug.
----------------------------------------------
-
|
作者: |
|
2016/8/15 17:19:39 |
3楼: |
嗯,我指的就是对象
----------------------------------------------
http://mcool.appinn.me/
|
作者: |
|
2016/8/15 17:24:06 |
4楼: |
第二点中,Self.Release应该放在OnClose中?网上看到,有人在OnClose中用了Self.Release,避免了一些内存读写错误弹窗..
----------------------------------------------
http://mcool.appinn.me/
|
作者: |
|
2016/8/15 17:30:33 |
5楼: |
这种方法就算行也只能掩盖问题。。。。我认为是不对的。。。没听说窗体在Close还要手动Release自己,如果你想不报错,还不如在Close时直接处理完善后事宜后直接Terminate得了。。效果是一样的。。
----------------------------------------------
-
|
作者: |
|
2016/8/15 17:32:18 |
6楼: |
比如有时候程序退出的。。。httpclient还在卡死在读某个网络文件中,没来的及释放。。。。这时候我不想等。。就直接Terminate。。。当然你自己要确信,这个操作不影响你的程序的数据完整性才行。。
----------------------------------------------
-
|
作者: |
|
2016/8/15 17:36:00 |
6楼: |
这里找到一个EurekaLog的详细使用说明:http://blog.csdn.net/akof1314/article/details/6968587
以前没用它真是太可惜(尝试过,不会使用放弃了..)
----------------------------------------------
http://mcool.appinn.me/
|
作者: |
|
2016/8/15 17:40:19 |
7楼: |
很简单的。。。不用用的太高深。。。。我也是简单用用。。。但是没它我不行,已经离不开了。。。。我一般只在出现问题时才需要调试开启的。。这样可以比较平衡。。。不然始终开启的话,每次编译会慢一会也不爽的。
----------------------------------------------
-
|
作者: |
|
2016/8/15 23:37:19 |
8楼: |
怎么让eureka默认不自动开启呀,搞的一不小心提交的代码里就带上它的相关代码,经常导致别人编译不过
----------------------------------------------
18114532@qq.com
|
作者: |
|
2016/8/16 8:55:21 |
9楼: |
内存读写错误都是过多的free造成的, 越是怕读写错误越增加free只会取得反效果
写少了free会造成的问题是内存泄漏
正确的程序free的数量只能是刚刚好一个不多一个不少, 这也就是难点所在
你应该追求的是每个变量自己都非常清晰什么时候分配内存而什么时候释放
----------------------------------------------
-
|
作者: |
|
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;
----------------------------------------------
-
|
作者: |
|
2016/8/16 9:39:22 |
11楼: |
主要是要有套规矩。如果是第三方代码,通常不要主动释放第三方代码的对象里的属性/变量所代表的对象。如果发现第三方有内存泄漏,再主动释放第三方代码的对象。 自己的代码应该有一套自己的Free规则:在哪里,由谁来Free应该有自己的一套习惯。 比方,我们项目写代码时,通常都会在变量后面加ref以表明这个变量里的对象是引用的。通常不用后续的其他代码来Free。 另外在使用属性赋值对象时,赋值函数里往往是克隆操作(assign),而不是简单的:=引用。
----------------------------------------------
-
|
作者: |
|
2016/8/16 13:28:25 |
12楼: |
个人习惯: 静态创建,原生delphi对象实例使用完Free就好。 OLE、变体对象实例用完FreeAndNil
----------------------------------------------
-
|
作者: |
|
2016/8/16 15:00:33 |
13楼: |
@jingtong Project>EurekaLog Options>Default 不要打勾
----------------------------------------------
http://mcool.appinn.me/
|
|