gpt4 book ai didi

delphi - 如何在Delphi中有效地使用接口(interface)进行内存管理

转载 作者:行者123 更新时间:2023-12-03 15:03:32 31 4
gpt4 key购买 nike

我对 Delphi 相当陌生,并且一直手动进行所有内存管理,但听说 Delphi 能够使用接口(interface)进行引用计数并以这种方式提供一些内存管理。我想开始使用它,但有几个问题。

  1. 一般来说,我该如何使用它。创建接口(interface)和实现它的类。然后,每当我需要该对象时,让该变量实际上是接口(interface)类型,但实例化该对象并立即完成?不需要考虑释放它吗?不再尝试最后了吗?

  2. 为真正不需要的类创建一堆接口(interface)似乎非常麻烦。关于自动生成这些内容有什么建议吗?我如何最好地组织它?接口(interface)和类在同一个文件中?

  3. 有哪些常见陷阱可能会让我感到悲伤?例如:将接口(interface)对象转换为其类的对象是否会破坏我的引用计数?或者 Delphi 是否有任何非显而易见的方式来创建引用循环? (意思是除了 A 使用 B 使用 C 使用 A)

如果有涵盖其中任何内容的教程,那就太好了,但我在搜索中没有找到任何内容。谢谢。

最佳答案

我目前正在处理一个非常大的项目,该项目利用接口(interface)引用计数的“副作用”来实现内存管理。

我个人的结论是,您最终会得到很多过于复杂的代码,原因无非是“我不必担心调用免费”

出于一些非常基本的原因,我强烈建议不要采取这种行动:

1) 您正在使用出于 COM 兼容性目的而存在的副作用。

2) 您正在加大对象占用空间和效率。接口(interface)是指向指针列表的指针......或者类似的东西。

3)就像您所说的...您现在必须创建一堆接口(interface),其唯一目的是避免自己释放内存...在我看来,这会造成比其值(value)更多的麻烦。

4) 最常见的错误是调试起来非常痛苦的,当对象在引用之前被释放时。我们自己的引用计数中有特殊的代码,可以在软件推出之前尝试测试此问题。

现在回答您的问题。

1)给定 TFoo 和接口(interface) IFoo,您可以拥有如下方法

function GetFoo: IFoo;
begin
Result := (TFoo.Create as IFoo);
end;

...然后,你不需要finally来释放它。

2)是的,就像我说的,你认为这是一个好主意,但它变成了一个巨大的痛苦

3)2个问题。

A) 你有 Object1.Interface2 和 Object2.Interface1...由于循环引用,这些对象永远不会被释放

B)在释放所有引用之前释放对象,我无法强调追踪这些错误有多么困难......

关于delphi - 如何在Delphi中有效地使用接口(interface)进行内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11784840/

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