COM学习之应用计数
完全参考博客:
http://www.cnblogs.com/Braveliu/p/3436206.html
引用计数规则:
1)输出参数规则:
任何在输出参数中或者作为返回值返回一个新的接口指针的函数必须对此接口指针调用AddRef。
典型案例:HRESULT QueryInterface(const IID&,void**)、CreateInstance();
2)输入参数规则:
对传入函数的接口指针,无需调用AddRef和Release,因为函数的生命周期嵌套在调用者的生命周期内。为记住这一点可以想象将函数的代码以内联方式展开的情形。
3)输入-输出参数规则:
在函数中,对于用输入、输出参数传递进来的接口指针,必须再给它赋另外一个接口指针值之前调用Release,在函数返回之前,还需对输出参数中保存的的接口指针调用AddRef。
void ExchangeForCachedPtr(int i, IX**ppIX)
{
(*ppIX)->Fx();
(*ppIX)->Release();
*ppIX = g_cache[i];
(*ppIX)->AddRef();
(*ppIX)->Fx();
}
4)局部变量规则:
对于局部复制的接口指针,由于他们只是在函数的生命周期内才存在,因此无需调用AddRef和Release。其实是输入参数规则的直接结果。
5)全部变量规则:
对于保存在全局变量中的接口指针,在将其传递给另外一个函数之前,必须调用其AddRef,由于此变量是全局性的,因此任何函数都可以通过调用其Release来终止其生命周期,对于保存在成员变量中的接口指针,也应该按照此方法处理。因为类中的任何成员函数都可改变此种接口指针的状态。
6)不能确定时的规则:
对于任何不能确定的情形,都应该调用AddRef和Release对。
专注搬砖,擅长搬砖砸自己的脚~~~
Email:
ltwbuaa@163.com

浙公网安备 33010602011771号