gpt4 book ai didi

delphi - 为什么基于TComponent的接口(interface)实现会泄漏内存?

转载 作者:行者123 更新时间:2023-12-03 14:34:57 28 4
gpt4 key购买 nike

此 Delphi 代码将显示 TMyImplementation 实例的内存泄漏:

program LeakTest;

uses
Classes;

type
MyInterface = interface
end;

TMyImplementation = class(TComponent, MyInterface)
end;

TMyContainer = class(TObject)
private
FInt: MyInterface;
public
property Impl: MyInterface read FInt write FInt;
end;

var
C: TMyContainer;
begin
ReportMemoryLeaksOnShutdown := True;

C := TMyContainer.Create;
C.Impl := TMyImplementation.Create(nil);
C.Free;
end.

如果将 TComponent 替换为 TInterfacedObject,并将构造函数更改为 Create(),则泄漏就会消失。这里与 TComponent 有什么不同?

非常感谢您的回答。总结一下:说“如果您正在使用接口(interface),它们会被引用计数,因此它们会为您释放”,这很简单,但却是错误的。 - 实际上任何实现接口(interface)的类都可以打破这个规则。 (并且不会显示编译器提示或警告。)

最佳答案

实现上的差异

  • TComponent._Release 不释放您的实例。
  • TInterfacedObject._Release 释放您的实例。

也许有人可以插话,但我的看法是,TComponent 并不意味着像我们通常使用接口(interface)的方式一样用作引用计数对象。 p>

TComponent._Release 的实现

function TComponent._Release: Integer;
begin
if FVCLComObject = nil then
Result := -1 // -1 indicates no reference counting is taking place
else
Result := IVCLComObject(FVCLComObject)._Release;
end;

关于delphi - 为什么基于TComponent的接口(interface)实现会泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2182612/

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