[原创]Delphi FreeAndNil 是一个过程,并不是函数. 以及Free的说明

Delphi FreeAndNil 是一个过程,并不是函数,看源代码就知道,它的主要作用是清空并释放对象

procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;

看代码的执行顺序,先置空,再释放

置空  清空指针指向内存的地址。

释放 释放实例占用的所有资源。Free后,指针不能再使用

 

关于Free的说明:

Free 销毁对象并释放其关联内存。

使用“free”去销毁对象。如果对象引用不是nil,Free会自动调用析构函数。任何在运行时实例化的没有所有者的对象都应该通过调用Free来销毁,这样就可以正确处理它并释放其内存。

与销毁(destroy)不同,即使对象为空,“free”也会成功;因此,如果对象从未初始化,Free不会导致错误。

当您为一个组件调用Free时,它会为它所拥有的所有组件调用Free,即它的组件列表中的所有组件。由于窗体拥有在设计模式下在其上创建的所有控件和其他组件,因此当窗体被释放时,这些组件将自动释放。例如:默认情况下,所有表单都属于Application对象;当应用程序终止时,它将释放application对象,从而释放所有表单。对于不是组件的对象,或使用零所有者创建的组件,请确保在完成它们之后调用Free;否则,所分配的内存将不可用,直到应用程序终止。

注意:切勿在组件自己的事件处理程序或其拥有或包含的组件的事件处理中显式释放组件。例如,不要在OnClick事件处理程序中释放按钮或拥有该按钮的窗体。

如果要释放表单,可以尝试去调用其Release方法,该方法会在执行所有事件处理程序及其包含的组件后销毁表单并释放为其分配的内存。

 

 

备注说明:

这里要重点说一下Free释放实例占用的资源,释放实例占用的所有资源。Free后,指针不能再使用

虽然这里说指针是不能再使用,但不表示它已经清空了(如果释放之前没有清空指针(nil)的动作),它依然是存在值的,例如,很多初学者经常犯的错误就是,窗体.free后,用Assigned 去判断窗体是否存在,发现Assigned函数依然返回true值,因为Assigned函数无法检测悬空指针(即不是nil但不再指向有效数据的指针),它不会检测到P无效的事实。

 

 

 

 

创建时间:2019.12.27  更新时间:2022.12.13-14

来源于:https://www.cnblogs.com/guorongtao/p/12107245.html

posted on 2019-12-27 14:48  滔Roy  阅读(1255)  评论(2编辑  收藏  举报

导航