警告:Delphi 接口引用对象时的陷阱
2006-05-17 11:38
225 查看
用接口来接管对象引用,以此来操作该对象,这种做法很常见,也很实用。
但是,在由于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智能的接口机制,可能会让该操作隐含陷阱
首先,让我们简单看一下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;
相关文章推荐
- 父类的引用指向子类的对象或者接口指向实现类均是可以的
- java笔试陷阱:对象引用作为参数传递时陷阱
- Delphi 与 VC 共享接口和对象
- Java关于接口引用实现该接口类的对象
- 通过接口引用对象
- Delphi面向对象学习随笔六:接口
- 通过接口引用对象
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- Delphi引用C对象文件
- QPointer,QSharedPointer,QWeakPointer的区别与使用例子(QSharedPointer类似Delphi里的引用计数,是强引用,而QWeakPointer是弱引用,不影响原始对象的引用计数,相当于是在暗中观察对象,但保持联系,需要的时候就会出现)
- Delphi面向对象学习随笔六:接口
- 自己管理对象生命周期中Delphi接口的一个问题
- JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序
- 第五十二:通过接口来引用对象
- Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题
- 关于接口对象直接引用实现类的对象的小结
- 通过接口引用对象
- 【疑难】Visual Studio Community 2015在新建项目时出现弹窗警告“未将对象引用设置到对象的实例”且无法创建项目
- 关于java基础中,接口里面父类的对象指向子类的引用
- Delphi 与 VC 共享接口和对象