日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

用CComPtr吧,COM接口指针很危险

發(fā)布時(shí)間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用CComPtr吧,COM接口指针很危险 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

COM接口指針很危險(xiǎn),因?yàn)槭褂眠^(guò)程中需要每一個(gè)使用者都要嚴(yán)格并且正確的AddRef和Release,一旦出現(xiàn)問(wèn)題,就會(huì)造成對(duì)象不能被正常釋放,或者對(duì)象被重復(fù)刪除,造成程序崩潰。所以使用COM接口,必須小心翼翼才行。
但是,即使所有的代碼中,都正確的AddRef和Release,也不一定能保證萬(wàn)無(wú)一失,例如:
void SomeApp( IHello * pHello )
{
IHello* pCopy = pHello;
pCopy->AddRef();
OtherApp();
pCopy->Hello();
pCopy->Release();
}
看起來(lái)好像無(wú)懈可擊,但是假設(shè)OtherApp中拋出了異常,那么pCopy->Release不就被跳過(guò)去了嗎?
幸好,所有的問(wèn)題都從簡(jiǎn)單到復(fù)雜,再?gòu)膹?fù)雜到簡(jiǎn)單的,因?yàn)槲覀冇蠧ComPtr!

CComPtr被稱為智能指針,是ATL提供的一個(gè)模版類,能夠從語(yǔ)法上自動(dòng)完成AddRef和Release。(源代碼在atlbase.h中)
CComPtr的用法很簡(jiǎn)單,以IHello*為例,將程序中所有接口指針類型(除了參數(shù)),都使用CComPtr<IHello> 代替即可。即程序中除了參數(shù)之外,再也不要使用IHello*,全部以CComPtr<IHello>代替。
CComPtr的用法和普通COM指針幾乎一樣,另外使用中有以下幾點(diǎn)需要注意。
1. CComPtr已經(jīng)保證了AddRef和Release的正確調(diào)用,所以不需要,也不能夠再調(diào)用AddRef和Release。
2. 如果要釋放一個(gè)智能指針,直接給它賦NULL值即可。(這一點(diǎn)要牢記曾因?yàn)闆](méi)有設(shè)置為null而出錯(cuò))
3. CComPtr本身析構(gòu)的時(shí)候會(huì)釋放COM指針。
4. 當(dāng)對(duì)CComPtr使用&運(yùn)算符(取指針地址)的時(shí)候,要確保CComPtr為NUL。(因?yàn)橥ㄟ^(guò)CComPtr的地址對(duì)CComPtr賦值時(shí),不會(huì)自動(dòng)調(diào)用AddRef,若不為NULL,則前面的指針不能釋放,CComPtr會(huì)使用assert報(bào)警)
以剛才的程序?yàn)槔?#xff1a;
void SomeApp( IHello * pHello )
{
CComPtr<IHello> pCopy = pHello;
OtherApp();
pCopy->Hello();
}
由于pCopy是一個(gè)局部的對(duì)象,所以即使OtherApp()拋出異常,pCopy也會(huì)被析構(gòu),指針能夠被釋放。
如果不想在程序臨近發(fā)布前,還因?yàn)镃OM指針的引用計(jì)數(shù)造成崩潰的話,就牢記這一點(diǎn)吧:程序中除了參數(shù)之外,不要直接使用COM指針類型,一定要全部以CComPtr<IXXX>代替。

總結(jié)

以上是生活随笔為你收集整理的用CComPtr吧,COM接口指针很危险的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。