COM 引用计数规则

摘自《Essential COM》第2.6节

一、COM的引用计数规则可以精简为以下三个简单的公理:

1.当一个非空的接口指针从一个内存位置被拷贝到另一个内存位置时,应该调用AddRef,以便通知对象又有附加的引用发生了。

2.对于已经包含非空接口指针的内存位置来说,在重写该内存位置之前,必须要先调用Release,以便通知对象“这个饮用已经被销毁了”。

3.如果你对两个或者多个内存位置之间的关系有特殊的理解的话,那么多余的AddRef和Release调用可以被优化掉。

 

二、要求调用AddRef方法的情形:

1.当把一个非空接口指针写道局部变量中时。

2.当被调用方把一个非空接口指针写道方法或者函数的[out]或者[in,out]参数中时。

3.当被调用方返回一个非空接口指针作为函数的实际结果时。

4.当把一个非空接口指针写到对象的一个数据成员中时。

 

三、要求调用Release方法的情形:

1.在改写一个非局部变量或者数据成员之前。

2.在离开非空局部变量的作用域(scope)之前。

3.当被调用方要改写方法或者函数的[in,out]参数,并且参数的初始值为非空时。注意,[out]参数往往被假定“输入时为空值”,所以被调用方永远也不必释放[out]参数。

4.在改写一个对象的非空数据成员之前。

5.在离开一个对象的析构函数之前,并且这时还有一个非空接口指针作为数据成员。

 

四、当把接口指针作为[in]参数传给函数时,可以适用前面给出的第三条关于特殊知识的规则:

1.当调用方把一个非空接口指针通过[in]参数传给一个函数或者方法时,既不需要调用AddRef,也不需要调用Release,因为在调用堆栈中,临时变量的生命周期只是“用于初始化形参”的表达式的生命周期的一个子集。

 

五、Release返回0的时候,这个对象一定不再有效,反之, 返回非0时,这个对象不一定仍然有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值