2017年5月12日金曜日

COMのCreateInstanceとAddRefとRelease

COMではまず、クラスをCreateInstanceして、QueryInterfaceして、ほっとけば呼び出し側の参照が切れたときに消える。

CreateInstanceでは参照カウントm_dwRefはゼロのまま。
QueryInterfaceではm_dwRefがインクリメントされる。
呼び出し側が参照をやめれば、勝手にm_dwRefがデクリメントされ、
CreateInstanceで作ったクラスのデストラクタが呼ばれる。
ちなみにデクリメントしたい場合は、Releaseを呼ぶ。

QueryInterfaceせず、呼び出し側に参照をさせないのであれば、
CreateInstanceして、色々使って、最後に消す必要も無く勝手に消えるんだろうと思っていた。
だってm_dwRefはゼロのままだからね?

ところが、これだと消えてくれないのだ。
CreateInstance
AddRef
いらなくなったらRelease
これでCreateInstanceで作ったインスタンスのデストラクタが動く。

AddRefでm_dwRefがインクリメントされ、
Releaseでデクリメントされる。
それだけにしか見えないんだけど、それやらないとデストラクタが動かない。

0 件のコメント: