Delphi内存管理设计策略:对象还是接口?

7

关于Delphi内存管理,您的设计策略是什么?

  • 在哪些用例中您更喜欢手动创建和释放对象?
  • 在哪些用例中,接口、InterfacedObjects及其引用计数机制将更受青睐?

您是否已经确定了一些参考计数对象的陷阱或困难?

感谢您在这里分享您的经验。

2个回答

7
无论何时在线程之间共享对象,最好使用接口。由于共享对象不一定有一个可识别的所有者,因此让放弃接口最后一个引用的线程释放实现对象是一种自然的适配方式。请参见OmniThreadLibrary,了解如何在设计上和在克服多线程代码中的一些复杂所有权问题方面利用接口的良好示例。

1

除非由于VCL限制不可能,否则您应始终优先使用接口。我怀疑如果Delphi 1.0中有接口,VCL的结果会非常不同。

一个小考虑是要注意引用循环。如果A持有对B的接口,而B持有对A的接口,则它们都将永远存在。


请详细说明一下那些VCL限制吗? - Pierre-Jean Coudert
3
许多VCL类使用不同的内存管理机制,因此您不能仅仅加入一个接口。一个明显的例子是TComponent的子组件,它们由父组件拥有并在父组件销毁时一起销毁。 - Marcelo Cantos
2
VCL 组件之间可以具有各种相互引用,如果将组件实现为接口,会导致循环引用的噩梦。 - The_Fox
@The_Fox 我认为对象实例或接口的循环引用并没有根本性的区别。接口甚至是解决循环单元接口的推荐解决方案之一。请参见https://dev59.com/rUzSa4cB1Zd3GeqPlEeq#2356690 - mjn
2
@mjustin:@The_Fox 正在谈论循环对象引用,这会导致使用引用计数(如接口)时出现泄漏问题。 - Marcelo Cantos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接