CComPtr学习

这些天在弄有关的智能指针,因为其原理与通用的智能指针相似,但并不完全相同,故只是借鉴学习一下CComPtr,这是按照 msdn上学习的,可能在有的方法还不是理解太透,希望不会引起什么误解。

CComPtr()
这是一个构造函数,初始化成员变量,默认的构造函数是将P设为NULL,拷贝构造函数则是将p指向了LP并且通过P调用AddRef,然后在其析构时会通过P调用Release。
Detach():
这个函数返回的是一个一个成员指针,同时将自己的成员指针设为了NULL,因为是设为了NULL那么在析构

并不会调用Release,也就是说其引用计数并没有变化。
Release():
这个方法是调用了基类的Release,并把p设为了NULL,
IsEqualObject(IUnknown *pOther):
用来比较两个对像是否相等同, 这也调用了基类的IsEqualObject.
Attach(T* p2):
这个方法将一个指针赋给了国一个指针而没有增加其引用计数。

HRESULT CopyTo(T** ppT );
将其内部指针拷贝给了目标指针,如果成功的话将添加引用计数。如果PPT为空的话则返回错误。
HRESULT SetSite(IUnknown* punkParent );
为指向其管理对像的指针设置大小,内部指针必须指向其已实现的对象。
Establishes a connection point with the object pointed to by this smart pointer.
HRESULT Advise(IUnknown* pUnk,const IID& iid,LPDWORD pdw );
通过这个智能指针与对像建立一个联接指针。 第一个参数是接引对像的指针,

HRESULT CoCreateInstance(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter = NULL,
DWORD dwClsContext = CLSCTX_ALL );

HRESULT CoCreateInstance(
LPCOLESTR szProgID,
LPUNKNOWN pUnkOuter = NULL,
DWORD dwClsContext = CLSCTX_ALL ); 在安全模式上为对像建立一个实例。

template <class Q>HRESULT QueryInterface(Q** pp );&<60; 这个方法在安全方式中调用了QUERYINTERFACE
操作有类型T*,*,&,->,=,!<,==

这是内部定义一个有关计数引用的例子:
tf_stdptr<IRawStreamCodec> spRawStreamCodec;
&<60;&<60;&<60; TFCreateInstance (TFCLSID_CRawStreamCodec, &spRawStreamCodec); //1

&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown = spRawStreamCodec;// ?2
&<60;&<60;&<60; }}
&<60;&<60;&<60; // ?1
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown = spRawStreamCodec;// 2 sp->p = spR;

sp->p->Addref
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.detach(); //2 //sp->p = null;
&<60;&<60;&<60; }}
&<60;&<60;&<60; //2
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown;`
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.attach(spRawStreamCodec); //2
&<60;&<60;&<60; }}
&<60;&<60;&<60; //1
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown;
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.attach(spRawStreamCodec); //1
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.detach(); //1
&<60;&<60;&<60; }}
&<60;&<60;&<60; //1
通过这个例子能很好的说明引用计数这个概念了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值