在Delphi中,class(TInterfacedObject)是否需要析构函数?

我在从未叫过Destroy()的情况下奔跑。

unit Unit2;

interface

type

// Interface
ITest = Interface(IInterface)
 function IsTrue() : Boolean;
end;

TmyClass = class(TInterfacedObject,ITest)
  public
    // Interface implementation
    function IsTrue() : Boolean;

    constructor Create();
    destructor Destroy(); override;
end;

implementation

constructor TmyClass.Create();
begin
  inherited Create();
end;

destructor TmyClass.Destroy();
begin
  inherited Destroy();
end;

published
  // Property
  property IsItTrue: Boolean read IsTrue;
end.

unit Unit1;

interface

uses
  Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,unit2;

type
  TForm1 = class(TForm)
  Button1: TButton;
  procedure FormCreate(Sender: TObject);
  procedure Button1Click(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;

var
  Form1: TForm1;
  fMyClass: TmyClass;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  fMyClass.Free;  // if refcount = 0 this works,if refcount <> 0 pointer error.
  //or
  fMyClass := Nil; // no error but Destroy wil not be executed
  Close();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  fMyClass := TMyClass.Create();
end;
end.

读取this article时,只有一个构造函数,而没有实现析构函数。

有什么特殊原因吗?

我是否应该通过实现myClass节来释放(如果需要)在finalization中定义的所有其他对象?

y5123768 回答:在Delphi中,class(TInterfacedObject)是否需要析构函数?

不调用析构函数的最可能原因是因为您没有将对象分配给接口变量。

procedure Test1;
var
  vMyObj : TObject;
begin
  vMyObj := myclass.Create;
end; <-Destructor NOT called here

procedure Test2;
var
  vMyIntf : IInterface;
begin
  vMyIntf := myclass.Create;
end; <-Destructor IS called here.

如果是这种情况,我邀请您阅读this answer以获得更多信息。

,

您的fMyClass变量是对象引用,而不是接口,因此它不参与TInterfaceObject的引用计数。

您需要更改此内容

fMyClass: TmyClass;

对此:

fMyClass: ITest;

然后您就可以完全摆脱fMyClass.Free;

unit Unit1;

interface

uses
  Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,unit2;

type
  TForm1 = class(TForm)
  Button1: TButton;
  procedure FormCreate(Sender: TObject);
  procedure Button1Click(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;

var
  Form1: TForm1;
  fMyClass: ITest;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  fMyClass := nil; // no error and Destroy will be executed
  Close();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  fMyClass := TMyClass.Create();
end;

end.

fMyClass := nil;仅在fMyClass是接口变量而不是对象引用并且您不能在接口变量上调用Free()时才调用引用计数。

本文链接:https://www.f2er.com/2992692.html

大家都在问