COM 的引用计数规则 AddRef/Release 规则
2013-12-12 21:17
246 查看
COM 的引用计数规则可以精简为以下三个简单的公理:
1、当一个非空的接口指针从一个内存位置被拷贝到另一个内存位置之前,应该要调用 AddRef,以便通知对象又有附加的引用发生了。
2、对于已经包含非空接口指针的内存位置来说,在重写该内存位置之前,必须要先调用 Release,以便通知对象这个引用已经被销毁了。
3、如果你对于两个或多个内存位置之间的关系有特殊的理解的话,那么多余的 AddRef 和 Release 可以被优化掉。
根据以上三条公理,我们可以把他变成实际的编程指导。
下面是一些比较通用的、要求调用 AddRef 方法的情形:
A1、当把一个非空接口指针写到局部变量中时。
A2、当被调用方把一个非空接口指针写到方法或者函数的实际结果时。
A3、当被调用方返回一个非空接口指针作为函数的实际结果时。
A4、当把一个非空接口指针写到对象的一个数据成员中时。
下面是一些比较通用的、要求调用 Release 方法的情形:
R1、在改写一个非空局部变量或者数据成员之前。
R2、在离开非空局部变量的作用域 (scope) 之前。
R3、当被调用方要改写方法或者函数的 [in,out] 参数,并且参数的初始值为非空时。
R4、在改写一个对象的非空数据成员之前。
R5、在离开一个对象的析构函数之前,并且这时还有一个非空接口指针作为数据成员。
还有一种很常见的特殊情况是,当把接口指针作为 [in] 参数传给函数时,可以适用前面给出的第3条关于内存位置之间的关系有特殊理解的规则:
S1、当调用方把一个非空接口指针通过 [in] 参数传给一个函数或者方法时,既不需要调用 AddRef,也不需要调用 Release,因为在调用堆栈中,临时变量的生命周期只是“用于初始化形式参数”的表达式的生命周期的一个子集。
这十条指导规则几乎涵盖了 COM 编程过程中屡屡出现的各种情况。
PS: 请尽量使用 COM 智能指针。可以避免因为疏忽或异常而绕过了 Release,引起泄露。
《COM 本质论》 Essential COM 中文版 44页
DON BOX 著 潘爱民 译
【转自:http://www.hoboss.com/blog/archives/420】
1、当一个非空的接口指针从一个内存位置被拷贝到另一个内存位置之前,应该要调用 AddRef,以便通知对象又有附加的引用发生了。
2、对于已经包含非空接口指针的内存位置来说,在重写该内存位置之前,必须要先调用 Release,以便通知对象这个引用已经被销毁了。
3、如果你对于两个或多个内存位置之间的关系有特殊的理解的话,那么多余的 AddRef 和 Release 可以被优化掉。
根据以上三条公理,我们可以把他变成实际的编程指导。
下面是一些比较通用的、要求调用 AddRef 方法的情形:
A1、当把一个非空接口指针写到局部变量中时。
A2、当被调用方把一个非空接口指针写到方法或者函数的实际结果时。
A3、当被调用方返回一个非空接口指针作为函数的实际结果时。
A4、当把一个非空接口指针写到对象的一个数据成员中时。
下面是一些比较通用的、要求调用 Release 方法的情形:
R1、在改写一个非空局部变量或者数据成员之前。
R2、在离开非空局部变量的作用域 (scope) 之前。
R3、当被调用方要改写方法或者函数的 [in,out] 参数,并且参数的初始值为非空时。
R4、在改写一个对象的非空数据成员之前。
R5、在离开一个对象的析构函数之前,并且这时还有一个非空接口指针作为数据成员。
还有一种很常见的特殊情况是,当把接口指针作为 [in] 参数传给函数时,可以适用前面给出的第3条关于内存位置之间的关系有特殊理解的规则:
S1、当调用方把一个非空接口指针通过 [in] 参数传给一个函数或者方法时,既不需要调用 AddRef,也不需要调用 Release,因为在调用堆栈中,临时变量的生命周期只是“用于初始化形式参数”的表达式的生命周期的一个子集。
这十条指导规则几乎涵盖了 COM 编程过程中屡屡出现的各种情况。
PS: 请尽量使用 COM 智能指针。可以避免因为疏忽或异常而绕过了 Release,引起泄露。
《COM 本质论》 Essential COM 中文版 44页
DON BOX 著 潘爱民 译
【转自:http://www.hoboss.com/blog/archives/420】
相关文章推荐
- 《COM技术内幕》代码之 引用计数的实现,AddRef,Release
- COM的引用计数规则
- [读书笔记] COM的引用计数规则
- 第二讲:计数引用AddRef与Release
- COM 引用计数规则
- 有效的使用和设计COM智能指针 ——条款16:智能指针的引入不能违反COM引用计数规则
- 引用计数和AddRef、Release
- 引用计数和AddRef、Release
- 引用计数和AddRef、Release
- COM的引用计数规则
- AddRef和Release 引用计数
- 引用计数和AddRef、Release
- Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- COM 学习笔记(2)-引用计数
- COM中需要调用AddRef和Release的10条规律
- [cocos2d-x3.x学习笔记]引用计数 内存管理 Ref AutoreleasePoo PoolManager
- COM笔记-引用计数
- COM笔记-引用计数
- (20)Cocos2d-x中的引用计数(Reference Count)和自动释放池(AutoReleasePool)
- bookone这个书籍对象被我release掉了,此时引用计数为0,为毛还能调用