日历归档 |
|
<< < 2024 - 11 > >> | Su | Mo | Tu | We | Th | Fr | Sa | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
|
|
|
About Me |
|
|
ZhangSichu |
|
Male |
|
32 |
|
ZhangSichu@gmail.com |
|
ZhangSichu@hotmail.com |
|
ZhangSichu.com |
|
weibo.com/zhangsichu |
|
|
|
个人推荐 |
|
|
|
|
分类归档 |
|
|
|
|
My Friends |
|
|
|
|
摘自《Essential Com》
|
COM 的引用计数规则可以精简为下面三个简单的公里: 1.当一个非空的接口指针从一个内存位置被拷贝到另一个内存位置时,应该要调用AddRef,以便通知对象又有附加的引用发生了。 2.对于已经包含非空接口指针的内存位置来说,在重写该内存位置之前,必须要先调用Release,以便通知对象“这个引用已经被销毁了”。 3.如果你对两个和多个内存位置之间的关系有特殊的理解的话,那么多余的AddRef和Release调用可以被优化掉。
下面是一些比较通用的,要求调用AddRef方法的情形: A1.当把一个非空接口指针写到局部变量中。 A2.当被调用方把一个非空接口指针写到方法或者函数的[out]或者[in,out]参数中时。 A3.当被调用方返回一个非空接口指针作为函数的实际结果时。 A4.当把一个非空接口指针写到对象的一个数据成员中时。
下面是一些比较通用的要求调用Release方法的情形: R1.在改写一个非空局部变量或者数据成员之前。 R2.在离开非空局部变量的作用域(scope)之前。 R3.当被调用方要改写方法或者函数的[in,out]参数,并且参数的初始值为非空时。注意,[out]参数往往被假“输入时为空值”,所以被调用方永远也不必释放[out]参数。 R4.在改写一个对象的非空数据成员之前。 R5.在离开一个对象的析构函数之前,并且这时还有一个非空接口指针作为数据成员。
还有一种很常见的特殊情况是,当把接口指针作为[in]参数传给函数时,可以使用前面给出的第3条关于特殊知识的规则: S1.调用方把一个非空接口指针通过[in]参数传递给一个函数或者方法时,既不需要调用AddRef,也不需要调用Release,因为在调用堆栈中,临时变量的生命周期只是"用于初始化形式参数"的表达式的生命周期的一个子集。
|
|
|
|
|
|