在Delphi中,在调用继承的析构函数之后执行代码是否真的可行?
您可以在System.Classes中找到相关信息:
destructor TThread.Destroy;
begin
[...]
inherited Destroy;
FFatalException.Free;
end;
我认为在调用继承的Destroy方法后访问实例成员是不好的做法。
在Delphi中,在调用继承的析构函数之后执行代码是否真的可行?
您可以在System.Classes中找到相关信息:
destructor TThread.Destroy;
begin
[...]
inherited Destroy;
FFatalException.Free;
end;
我认为在调用继承的Destroy方法后访问实例成员是不好的做法。
在调用继承的析构函数后执行代码是完全安全的,只要该代码不依赖于被该继承的析构函数销毁的任何内容。同样地,在调用继承的构造函数之前执行代码也是安全的,只要该代码不依赖于在该继承的构造函数中实例化的任何内容。
但是这种写法并不好,这是肯定的。有时候会有理由让您编写这种代码,但通常这些原因应该被视为设计上的问题指示。
在您给出的示例中,没有必要以这种方式编写代码。对 FFatalException.Free
的调用可以在调用继承的析构函数之前完全进行。
实例在内存中不是由析构函数本身删除的,而是通过调用TObject.FreeInstance
方法进行删除。
由于析构函数代码的处理是后置的,所以会调用TObject.FreeInstance
方法。
顺带一提:构造函数也是同样的道理。实例是通过class function TObject.NewInstance : TObject
创建的,并且在调用构造函数之前(因为它是构造函数)被调用。
正因为如此,您将在整个构造函数或析构函数代码中拥有有效的实例。