【发布时间】:2016-11-21 17:27:58
【问题描述】:
我有一条记录,其中包含我认为是指向引用计数对象的指针。我希望如果我在记录中创建引用计数对象,当记录超出范围时,对象的引用计数将降至零,并且对象将被销毁。但情况似乎并非如此。这是示例最小代码。我的表单恰好有一些面板和备忘录,但只有 TButton(特别是 Button1Click)很重要。
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TUserData = class( TInterfacedObject )
public
AData : integer;
constructor Create;
destructor Destroy; override;
end;
TTestRec = Record
AField : integer;
UserData : TUserData;
End;
TForm4 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Memo1: TMemo;
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
var
iRec : TTestRec;
begin
iRec.UserData := TUserData.Create;
// stop too much optimisation
Button1.Caption := IntToStr( iRec.UserData.AData );
end; // I would expect TTestRec and hence TTestRec.UserData to go out of scope here
procedure TForm4.FormShow(Sender: TObject);
begin
// show leaks on exit
ReportMemoryLeaksOnShutdown := TRUE;
end;
{ TUserData }
constructor TUserData.Create;
begin
inherited Create;
AData := 4;
end;
destructor TUserData.Destroy;
begin
inherited;
end;
end.
我承认我并不真正了解引用计数的详细工作原理,尽管我确实了解其原理。我错过了什么?我是否期望过高,如果是这样,有什么方法可以避免内存泄漏,不是在这种特定情况下(显然我可以在退出时销毁 UserData),但总的来说,因为记录不支持析构函数。
【问题讨论】:
-
看看stackoverflow.com/questions/3920470/…,它应该可以帮助您更好地了解发生了什么。
标签: delphi