gpt4 book ai didi

Delphi子类的引用计数

转载 作者:行者123 更新时间:2023-12-03 14:39:58 25 4
gpt4 key购买 nike

假设我有这样的情况:

ITest = interface
procedure somethingHere();
end;

TImpl = class(TInterfacedObject, ITest)
procedure somethingHere();
end;

TImplSub = class(TImpl)

end;

鉴于上面的代码,如果我不使用 try-finally 语句,我就可以使用这种代码而不会出现任何内存泄漏:

var a: ITest;
begin
a := TImpl.Create;
end;

子类也是如此吗?

var a: ITest;
begin
a := TImplSub.Create;
end;

我认为,既然TImplSub是TImpl的子类,那么TImplSub继承了父类的TInterfacedObject和ITest。上面的代码会泄露吗?

这可能不相关,但我如何检查上面的代码是否泄漏?

最佳答案

接口(interface)引用的引用计数由 _AddRef_Release 方法触发,在本例中,这些方法在 TInterfacedObject 中实现。您的子类继承了引用计数行为。

您可以使用(实际上必须使用)接口(interface)引用来存储您的子类对象实例,即您编码的方式。 (不使用接口(interface)引用来存储引用计数对象实例会破坏引用计数机制)

以下代码不会泄漏,并且不需要 try...finally block ,因为销毁是自动的。

var a: ITest;
begin
a := TImplSub.Create;
end;
<小时/>

要检查 Windows 编译器下的内存泄漏,您可以使用 ReportMemoryLeaksOnShutdown

begin
ReportMemoryLeaksOnShutdown := true;
...
end.
<小时/>

在调查特定行为时测试对象是否被销毁的另一种方法是重写析构函数并在那里设置断点。

关于Delphi子类的引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com