c语言构造函数计算一加到一百,构造函数引用计数加1-Read.ppt

构造函数引用计数加1-Read

十六 ATL;1 ATL对COM客户端的支持;实现了引用计数后, 每个对象维护一个引用计数,当接口指针被复制的时候,计数增加;接口指针被销毁的时候,计数减少。 1。当接口指针被复制时,调用DuplicatePointer 即AddRef 2。当接口指针不再有用时调用DestroyPointer 即Releasevoid f(void){ IFastString *pfs=0; IPersistentObject *ppo=0; pfs=CreateFastString("asdf"); if(pfs) { ppo=(IPersistentObject*) pfs->Dynamic_Cast("IPersistentObject"); if(ppo) { ppo->Save("c:\\myfile"); ppo->DestroyPointer();} //每个指针各自负责自己。 pfs->DestroyPointer();//每个指针各自负责自己。 }}或者使用正式的表达方式:;void GetLottaPointers(LPUNKNOWN pUnk){ HRESULT hr; LPPERSIST pPersist; LPDISPATCH pDispatch; LPDATAOBJECT pDataObject; hr = pUnk->QueryInterface(IID_IPersist, (LPVOID *)&pPersist); //引用计数加1 if(SUCCEEDED(hr)) { hr = pUnk->QueryInterface(IID_IDispatch, (LPVOID *) &pDispatch); //引用计数加1 if(SUCCEEDED(hr)) { hr = pUnk->QueryInterface(IID_IDataObject, (LPVOID *) &pDataObject); //引用计数加1 if(SUCCEEDED(hr)) { DoIt(pPersist, pDispatch, pDataObject); //同时使用三个指针 pDataObject->Release(); } //释放引用 pDispatch->Release(); } //释放引用pPersist->Release(); } //释放引用 pUnk指向的对象的引用计数在退出此函数时保持不变。对象检测到引用为零时,会删除自己。 }比较没有引用计数的情况,有了很大的进步。但是仍然要小心。;CComPtr;/* 重载了=操作符进行赋值操作,在赋值操作时: 1当前接口指针非NULL时,Release 2源接口指针非NULL时,AddRef 3把源接口指针保存为当前接口指针*/

这里使用了AtlComPtrAssign函数。 IUnkown* AtlComPtrAssign(IUnknown**pp,IUnkown *lp){ if(*pp) (*pp)->Release(); // 当前指针要指向新的对象,原对象引用要减1 if(lp) lp->AddRef(); //源指针要被复制,引用计数要加1。 *pp=lp; return lp;}......};在智能指针的支持下,对象的引用计数处理起来更加方便:void GetLottaPointers(LPUNKNOWN pUnk){ HRESULT hr; CComPtr persist; CComPtr dispatch; CComPtr dataobject; hr = pUnk->QueryInterface(IID_IPersist, (LPVOID *)&persist); //引用计数不变if(FAILED(hr)) return;hr = pUnk->QueryInterface(IID_IDispatch, (LPVOID *) &dispatch); //引用计数不变if(FAILED(hr)) return; hr =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值