关于接口引用计数的疑惑(100)

  • 主题发起人 主题发起人 hs-kill
  • 开始时间 开始时间
H

hs-kill

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有一个COM的组件,假设为A,引入delphi里接口为IA,声明为coaA组件里有一个相关的对象B,在引入delphi里后接口为IB现在A有一个方法GetB返回的是IB接口我在程序里这样调用var sa:ia;
sb:ib;begin
sa:=coa.Create;
sb:=coa.GetB;...end;
现在问题来了如果我程序这么写的话,在过程结束后会出现错误经过分析是因为在执行sb:=coa.GetB;的时候并没有增加引用计数,而过程结束后编译器自动把sb设置为nil时却减少了引用计数所以我现在把程序改成这样就OK了:begin
sa:=coa.Create;
sb:=coa.GetB;
sb._AddRef;...end;
虽然问题解决了,但是我有个疑问,在接口赋值的时候,不是应该由编译器自动执行引用+1的操作吗,可是我看了CPU执行过程,并没有执行增加引用的操作,仅仅是执行了接口初始化和指针赋值的操作但是如果我另外加个变量xsa执行xsa:=sa的时候却又有增加引用计数操作现在我糊涂了,编译器在什么情况下才会自动执行增加引用计数??
 
这个引用计数跟STRING类型的引用计数是类似的,比如定义一个字符串var S,s1:String;begin
S:='abc';这个时候引用计数还是0; S:='ABC';引用计数还是0; s1:=S:这时候引用计数就为1了。
 
在接口赋值的时候,不是应该由编译器自动执行引用+1的操作吗?--> 不是。
 
呃......那比如ixmlnode之类的接口在执行类似inode:=inodelist.findenode('xxxx');的代码后好像也没增加引用计数,为什么释放的时候也不出错呢?难道findnode内部增加引用计数了?关键是这个问题在VB上不会出现,因为VB的变量置空的时候不减少引用计数,而是类似delphi的pointer(inode):=nil;这样的操作..
 
在接口赋值的时候,不是应该由编译器自动执行引用+1的操作吗?--> 不是。要看赋值的变量的作用域吧。
 
后退
顶部