IUnknown的另外两个成员函数AddRef和Release是引用计数的代码实现。
COM组件都会维护一个表示引用计数的数值。
客户取得一个接口时,计数值+1——AddRef,使用完后-1——Release。
为0时,组件可将自己从内存中删除。
关于此有三条简单的规则:
1、在返回之前调用AddRef。对与返回接口指针的函数,在返回之前,用相应的指针调用AddRef。QueryInterface、CreateInstance。这样一来,客户从实现处得到接口后就无需AddRef。
2、使用完接口后Release。
3、赋值后AddRef。例如在将一个接口指针赋值给另外一个接口指针时,后者应调用AddRef。意味着:在给某个接口指定别名时都应调用AddRef。
如果是别名的话,也就没有后者前者的区别了吧?!?!。
“对于客户而言,每个接口分别被维护一个引用计数意味着,客户应该对它将要使用的那个指针调用AddRef,而不是其他什么指针。”