8

在析构函数中继承调用之后执行代码真的可以在 Delphi 中执行吗?

您可以在 System.Classes 中找到它:

destructor TThread.Destroy;
begin
[...]
  inherited Destroy;
  FFatalException.Free;
end;

我认为,在调用继承的 Destroy 方法后访问实例成员是一个坏主意。

4

2 回答 2

9

在调用继承的析构函数后执行代码是完全安全的,只要该代码不依赖于已被继承析构函数破坏的东西。同样,在调用继承构造函数之前执行代码是安全的,只要代码不依赖于继承构造函数中实例化的任何内容。

但这肯定不是好风格。有时有一些原因会导致您使用此类代码,但通常应将此类原因视为您的设计中有问题的迹象。

在您给出的示例中,根本不需要那样编写代码。调用FFatalException.Free很可能发生在调用继承的析构函数之前。

于 2013-06-25T12:18:40.700 回答
5

实例不是通过析构方法本身从内存中删除,而是通过调用TObject.FreeInstance

TObject.FreeInstance被调用,因为处理析构函数代码之后调用了析构函数。

BTW:构造函数也是一样。实例被创建class function TObject.NewInstance : TObject并在构造函数被调用之前被调用(仅仅因为它是构造函数)

因此,您将在整个构造函数或析构函数代码中拥有一个有效的实例。

于 2013-06-25T13:25:21.070 回答