Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么实现接口的Delphi对象需要引用计数?_Delphi_Interface_Com - Fatal编程技术网

为什么实现接口的Delphi对象需要引用计数?

为什么实现接口的Delphi对象需要引用计数?,delphi,interface,com,Delphi,Interface,Com,换句话说,为什么不能像常规对象那样手动管理它们?还是Delphi设计者决定使用引用计数,因为COM无论如何都需要它?首先要确定的是,Delphi中添加了接口以支持COM。所以,许多设计决策都是出于让COM编程更容易的愿望 接口引用完全可以手动管理。事实上,C和C++中的原始COM最初涉及到手动引用计数管理,对“代码> AddiFF < /C>和发布< /代码>进行了明确的调用。使用C中的COM对象时,仍然需要执行手动引用计数管理。对于C++,这些天通常使用一个类,比如“代码> CCOPTR <

换句话说,为什么不能像常规对象那样手动管理它们?还是Delphi设计者决定使用引用计数,因为COM无论如何都需要它?

首先要确定的是,Delphi中添加了接口以支持COM。所以,许多设计决策都是出于让COM编程更容易的愿望

接口引用完全可以手动管理。事实上,C和C++中的原始COM最初涉及到手动引用计数管理,对“代码> AddiFF < /C>和<代码>发布< /代码>进行了明确的调用。使用C中的COM对象时,仍然需要执行手动引用计数管理。对于C++,这些天通常使用一个类,比如“代码> CCOPTR < /Cord>”来启用自动引用计数管理。 当COM支持被添加到Delphi时,Delphi的主要竞争对手是VB。在VB中,您从来没有做过手动引用计数管理。如果Delphi设计人员没有实现自动引用计数管理,那么要吸引VB程序员离开VB并开始使用Delphi就会困难得多。因此,我推测这是德尔福设计师做出决定的驱动因素。即使不是这样,对自动引用计数进行编码也比手动编程容易得多。因此,即使我的猜测是错误的,德尔福设计师所做的决定也让生活简单了很多

因此,要回答您的具体问题:

为什么不能像常规对象那样手动管理它们

他们可能是。您可以实现
\u AddRef
\u Release
,这样它们就不会控制对象的生存期。具体来说,这些方法不必计算引用,也不必
\u Release
调用
Free

Delphi设计人员是否决定使用引用计数,因为COM需要它

嗯,COM不需要它。正如我上面所说的,您可以在C或C++(或其他语言)中对COM进行编码,而不进行自动引用计数。

您可能会问的另一个问题是,为什么Delphi接口必须派生自
IInterface
。这源于它们最初的目的,即实现COM接口。在许多方面,如果我们能够拥有不是从
IInterface
派生的接口,那就太好了。但事实就是这样。

接口什么都不做。如何管理引用计数取决于实现接口的类。无论如何,新的基于LLVM的Delphi编译器也为对象引用引入了引用计数。@Güntherthebeauty这是真的。但是所有的Delphi接口都来自
IInterface
,因此分配引用会导致编译器生成对
\u AddRef
\u Release
的调用。实现对象可能什么也不做,但调用仍然存在。这是不需要做的事情,也不被烘焙成C语言和C++语言。事实上,对象不是引用计数,接口是。当然,对象也必须实现该部分,但是对AddRef和Release的调用通常在接口上,而不是在对象上。请注意,从
TComponent
派生的Delphi对象在实现任何接口时都禁用了引用计数。在编译器中引入一个新的非refcounted接口类型之前已经被多次请求过,Embarcadero知道这一点。它是否会被实施是任何人的猜测。