警告:Delphi 接口引用对象时的陷阱

原创 2006年05月17日 11:38:00

用接口来接管对象引用,以此来操作该对象,这种做法很常见,也很实用。

但是,在由于Delphi智能的接口机制,可能会让该操作隐含陷阱

首先,让我们简单看一下Delphi的接口机制:

一般,我们写的接口都继承自IInterface,实现接口的类也继承自TInterfacedObject,因为它们都替我们实现了

function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;

到这,问题就来了

以上两个接口生命周期相关的函数是上述接口和类自动替我们实现的

当将一个接口设置为NIL时,它所引用的对象也会被释放掉(的确让人恐怖)(Delphi调用_Release)

所以,当接口引用一个对象且这个对象的生命周期不确定时,这个自动的机制就留下了一个不大不小的隐患。

那到这你是不是想到了,不去手动将接口设为nil?嗯,听我接着说:

delphi的IInterface接口的生命周期是自管理的,因此,当这个接口不再被使用时,Delphi会认为你忘记把这个地址引用置为nil了,所以你会自动给你加上,那么历史又重现了。

那么怎么样避免这个陷阱呢?

我们不能直接将接口设为nil,为了绕开Delphi的自动管理机制,我们需要先将接口转换成指针,然后将它设为nil,这就避免了Delphi认为这个接口不再被使用,自动将其设为nil。

Pointer(IMyInterface) := nil;

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题

这篇是 2011 年写的。现在 delphi 在 Android, Linux  下面增加了对象的生命周期自动化的管理,但具体如何,我还没仔细测试过。 网上有篇文章《Delphi接口编程的两大陷...

Delphi面向对象学习随笔六:接口

====================================================== 注:本文源代码点此下载 =============================...

Delphi面向对象学习随笔六:接口

Delphi面向对象学习随笔六:接口   Delphi面向对象学习随笔六:接口 作者:巴哈姆特 (转载请注明出处并保持完整) 在对象化中,类的继承是一个非常强大的...

Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题。

网上有篇文章《Delphi接口编程的两大陷阱》,里面提到接口的生存期管理的问题。但该文章里面提到的两个问题,其实都是对 Delphi 不理解导致的。   先说该篇文章中提到的第一个问题...

Delphi 与 VC 共享接口和对象

我经常会用 Delphi 写一些工具和应用,为了扩展方便,大部分都会做成插件形式。 迫于某些原因,我的插件不得不用其他开发工具来完成,比如 VC。 于是有个大问题需要解决:如何让 D 和 VC 互...

GCD:嵌套dispatch_async时__block对象的一个内存陷阱

啥也不说,先上代码:     dispatch_async(whatever_queue, ^{         NSNumber* number = nil;     &...

Delphi引用C对象文件

C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小,因此如果我们无需转换为Delphi代码而可以直接使用这些库的部分代码就完美了.幸运的是,Delphi允许连接到C...

delphi 陷阱

初学DelphiI的人,由于各种原因,对DelphiI中的许多概念不能很好的理解,并由此带来了许多的问题,或者是开发出的程序稳性不好,一会能运行,一会又不能运行;或者是遇到一个问题久思不得其解,还误以...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)