发现BCB6的TComInterface实现有点问题

发现BCB6的TComInterface实现有点问题

TComInterface类似于VC的Com指针,赋值时会AddRef,释放时会Release.
例:
    IHTMLDocument2 *pDoc=NULL;
    cb->Document->QueryInterface(__uuidof(IHTMLDocument2),(void**)&pDoc);  //cb是TCppWebBrowser控件
    if(pDoc)
    {
 //...
        pDoc->Release();
    }
可以改成:
TComInterface <IHTMLDocument2> pDoc(cb->Document);
if(pDoc)
{
 //... 
}

但是运行它会出现内存读写错误,最后发现utilcls.h 第2991行

template <class I> TComInterface(const DelphiInterface<I>& src)

应改成

template <class I> TComInterface(const DelphiInterface<I>& src) : intf(0)

否则因intf未初始化为0, 它随后调用的if(intf) intf->Release()会出错.


另外还有一疑问,以我的理解此构造函数的代码里应该不用AddRef才对,因为它调用的operator=(const DelphiInterface<I>& src)里使用了QueryInterface.
So 偶把AddRef这行也注释了, 是不是正确不敢说

感言:微软的COM技术简直就是造成内存泄漏的超级凶手,每个人对它的理解都五花八门. 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值