robsean@126.com QQ群:192903718
1 / 8
5. 释放类
5.1. 记住释放类实例
类实例不得不手动释放,否则你将得到内存泄露.我建议使用 FPC -gl -gh 选项来侦查内存泄
露(查看 https://castle-engineio/manualoptimization.php#section_memory).
注意,这不涉及提引(raised)异常。尽管当提引(raising)一个异常时,你确实创建一个
类(并且它是一个完美的正常的类,并且你也可以创建你拥有的为这个目的类)。但是这个
类实例是自动释放的。
5.2. 如何释放
为释放类实例,最好在你的类实例上调用 FreeAndNil(A)。它检查是否 A 是 nil ,如果不
是—调用它的析构函数(destructor),并且设置 A 到 nil 。所以在一个行中调用它很多
次不是一个错误。
它是或多或少的一个快捷方式(shortcut),对于
if A <> nil then
begin
A.Destroy;
A := nil;
end;
事实上,这是一个过度简化的,在一个适合的引用(reference)上,因为 FreeAndNil做了
一个有用的骗局(trick),并在调用析构函数(destructor)前设置变量 A 为 nil。这帮助阻
止某一个类的错误(bugs)—这个主意是,"外部的" 代码应该永远不能访问类的一个半破坏
的(half-destructed)实例。
你将经常看到人们使用 A.Free方法。这是像做
if A <> nil then
A.Destroy;
这释放 A ,除非它是 nil 。
注意,在正常情况下,在一个可能是 nil的实例上,你应该永远不调用一个方法。所以,如
果 A 可能是 nil,乍看之下,调用 A.Free 可能看起来令人怀疑。然而, Free 方法是这个
规则的一个例外。在实施(implementation)中它做的有些卑鄙(dirty)— 也就是,检查
是否 Self <> nil。这个卑鄙的骗局(dirty trick)仅工作在非虚拟(non-virtual)方法
中(这不调用任何的虚拟方法和不访问任何的字段(fi
nil/实例/调用/释放/方法/Free/卑鄙/dirty/骗局/trick/
nil/实例/调用/释放/方法/Free/卑鄙/dirty/骗局/trick/
-->