有关CComPtr&CComQIPtr,CComBSTR,CComVariant,CAutoPtr的设计思想的分析

这三种类型的封装类都对其封装类型进行包裹,尤其是提供分配内存以及释放内存。在设计思想上不同的是:

CComPtr<T>&CComQIPtr<T>:用于维护COM的接口,

l  对于构造函数和赋值等于,

n  无论传入T还是CComPtr<T>,都直接或间接AddRef(相当郁复制)并不是owner相应的T。也就是说通过构造函数或赋值等于传入的T还是由外部来owner释放。

addRef直接owner T的办法只有两个:

l  使用Attach,直接owner T(自动释放原有T);

l  operator T&,在使用中直接替代T。这样就可以间接修改其包含的T,而不AddRef。(事实上这种情况很常用,需要记得释放原来ownerT

 

CComBSTR:用于维护BSTR

l  对于构造函数和赋值等于,都进行复制。

l  使用Attach,直接owner  BSTR(自动释放原有BSTR);

l  operator BSTR&,在使用中直接替代BSTR,这样就可以间接修改其包含的BSTR(需要手动释放原有BSTR);

 

CComVariant:用于维护VARIANT

l  对于构造函数,

n  传入的大部分值,直接owner(主要是LPSTRLPCOLESTRBSTRowner指针);

n  传入VARIANTCComVariant&SAFEARRAY进行复制,在赋值等于时,全部进行复制(不owner);

n  对于IUnknown等调用addRef

l  对于赋值等于,全部进行复制(自动释放原有VARIANT

l  Attach 是进行复制,而不是owner(自动释放原有VARIANT);

l  继承VARIANT,在使用中直接替代VARIANT,从而可修改其内部的值(需要记得释放VARIANT);

 

CAutoPtr:用于维护C++指针:

l  对于构造函数,无论传入p还是CAutoPtr<p>,都转移ownership

l  对于赋值等于,只实现了对CAutoPtr<P>CAutoPtr<p2>,都转移ownership自动释放原有p);

l  Attach转移ownership不释放原有p)(之所以这样做据说是为了用户不会丢失attach的内容)。

l  没有operator p,但是指针public,可直接访问;

 

事实上,个人认为,CComVariantCAutoPtr的设计行为存在问题,

为什么CComBSTRCComVariant设计行为不一致?说实话, CComBSTR比较正常,CComVariant的行为实在挺烂的。其构造函数和赋值等于行为居然不一样,也不提醒一声,很容易让人弄错了。

CAutoPtrAttach也挺诡异,容易让用户忘记Free

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值