Delphi接口中的引用计数

时间:2017-06-22 10:11:55

标签: delphi reference-counting

基本问题。 在Button1Click中我创建了一个interfaced对象。创建后的引用计数为0。 我将对象作为参数传递。引用计数增加,在函数结束时减少,当它为0时,它被破坏。我错过了什么吗?当我首先创建对象时,我认为引用计数应为1? lListFilter没有持有对象的引用?

type
    IPersistentListFilter = Interface(IInterface)
        ['{57cdcf89-60ee-4b3c-99fd-177b4b98d7e5}']
        procedure IncludeObject;
end;

procedure FillList(AFilter : IPersistentListFilter);

type
TPersistentListFilter = class(TInterfacedObject, IPersistentListFilter)
    procedure IncludeObject;
    constructor Create;
    destructor Destroy; override;
end;

implementation

procedure FillList(AFilter: IPersistentListFilter);
begin
     AFilter.IncludeObject;
end;

constructor TPersistentListFilter.Create;
begin
    inherited;
end;

destructor TPersistentListFilter.Destroy;
begin
    inherited;
end;

procedure TPersistentListFilter.IncludeObject;
begin
    // do nothing
end;

procedure TForm8.Button1Click(Sender: TObject);
var
    lListFilter: TPersistentListFilter;
begin
    lListFilter := TPersistentListFilter.Create;
    // ref count is 0
    FillList(lListFilter);
    // lListFilter has been destroyed
    FillList(lListFilter);  // --> error
end;

1 个答案:

答案 0 :(得分:2)

auto val = f(); T& x = get<0>(val); T2 const y = get<1>(val); T3 const& z = get<2>(val); 中,Button1Click被声明为lListFilter的实例,而不是TPersistentListFilter。因此,创建IPersistentListFilter时不会发生引用计数。

lListFilter需要声明为lListFilter

IPersistentListFilter