Delphi全局接口变量重赋值后,原关联接口对象是否会被销毁?
Delphi接口引用计数与对象销毁问题解答
核心结论
重赋值全局接口变量会触发第一个tMySyncClass对象的销毁,调用MyProc后不存在未被引用的tMySyncClass对象。
具体分析
Delphi中TInterfacedObject实现的接口遵循标准引用计数规则:
- 当接口变量被赋值为某对象实例时,该对象的引用计数会+1;
- 当接口变量被重新赋值(或超出作用域)时,会先对原指向的对象调用
_Release方法,将其引用计数-1; - 若引用计数降至0,对象会立即调用
Destroy销毁自身。
对应你的代码场景:
- 执行
MyInterfaceVar := tMySyncClass.create();时,新创建的tMySyncClass实例引用计数变为1(由全局变量MyInterfaceVar持有); - 执行
MyInterfaceVar := tMyAsyncClass.create();时,Delphi会先处理旧值:对原tMySyncClass实例调用_Release,其引用计数从1变为0,触发对象销毁; - 随后新的
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
相关产品推荐
相关产品推荐

