用CComPtr吧,COM接口指针很危险
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)題。
- 上一篇: 独立成分分析ICA系列1:意义
- 下一篇: 便携本市场一片混乱 东芝也加入战斗