You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi全局接口变量重赋值后,原关联接口对象是否会被销毁?

Delphi接口引用计数与对象销毁问题解答

核心结论

重赋值全局接口变量会触发第一个tMySyncClass对象的销毁,调用MyProc后不存在未被引用的tMySyncClass对象。

具体分析

Delphi中TInterfacedObject实现的接口遵循标准引用计数规则:

  • 当接口变量被赋值为某对象实例时,该对象的引用计数会+1;
  • 当接口变量被重新赋值(或超出作用域)时,会先对原指向的对象调用_Release方法,将其引用计数-1;
  • 若引用计数降至0,对象会立即调用Destroy销毁自身。

对应你的代码场景:

  1. 执行MyInterfaceVar := tMySyncClass.create();时,新创建的tMySyncClass实例引用计数变为1(由全局变量MyInterfaceVar持有);
  2. 执行MyInterfaceVar := tMyAsyncClass.create();时,Delphi会先处理旧值:对原tMySyncClass实例调用_Release,其引用计数从1变为0,触发对象销毁;
  3. 随后新的tMyAsyncClass实例被赋值给MyInterfaceVar,引用计数变为1。

所以调用MyProc后,原tMySyncClass对象已经被完全销毁,不存在残留的未引用对象。

补充验证

如果想直观验证,可以在tMySyncClass的Destroy方法中加入日志输出:

type
  tMySyncClass = class(TInterfacedObject, TmyInterface)
    destructor Destroy; override;
  end;

destructor tMySyncClass.Destroy;
begin
  Writeln('tMySyncClass destroyed');
  inherited;
end;

运行MyProc时,会在控制台看到tMySyncClass destroyed的输出,证明对象确实被销毁了。


内容的提问来源于stack exchange,提问作者david

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:33:10