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的时候却又有增加引用计数操作现在我糊涂了,编译器在什么情况下才会自动执行增加引用计数??
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的时候却又有增加引用计数操作现在我糊涂了,编译器在什么情况下才会自动执行增加引用计数??