為什麼智能指標還需要 Release呢,智能指標不是不需要進行管理引用計數了嗎,為什麼還需要程式員來release?
原因是,智能指標對象在對象銷毀時釋放所指向的介面,但如果沒有在函數退出前,你銷毀了com庫,那就需要提前來Release它。
如:
::CoInitialize( NULL ); //如果在這裡初始化,則要注意智能指標的釋放
CComQIPtr < IFun, &IID_IFun > spFun;
HRESULT hr = spFun.CoCreateInstance( CLSID_Fun );
ASSERT( SUCCEEDED( hr ) );
// 為簡單起見,不再用if判斷HRESULT了。並且不再對IFun::Add()調用舉例
CComBSTR s1( "Hello" ), s2( " world" ), s3;
hr = spFun->Cat( s1, s2, &s3 );
ASSERT( SUCCEEDED( hr ) );
CString sMsg( s3 );
AfxMessageBox( sMsg );
// spFun->Release(); // 大錯特錯!!!!!
spFun.Release(); // 正解
::CoUninitialize(); //////////////////////如果不是在這裡銷毀初始化,那麼可以沒有上面的Release,這樣,在函數退出時,它就可以自動的銷毀對介面的引用。
下面一段話來自 wpf2006的部落格
如果在C++中調用com組件,可以使用智能指標簡化需要做的工作。智能指標還可以解決編程當中的一些問題,比如手工處理介面的引用計數很容易出錯,往往非常難以尋找,用智能指標就不會出現這種情況。下面總結一下有關智能指標的要點。
在實現上,智能指標是一個C++類,它封裝了一個com介面指標。在概念上,智能指標可以如同介面指標一樣來使用,但又有所區別。我們還是從使用概念出發來認識它。
一個智能指標對應一個介面指標。定義智能指標並用對應介面指標初始化以後,可以通過智能指標的->調用介面中的函數,可以用介面指標給智能指標賦值,改變它對應的介面。這是基本的兩個用法,都是通過重載相應運算子實現的,還有其他運算子可以重載,使智能指標和介面指標更為相似。那麼好處在哪裡呢?智能指標在使用上無關引用計數,在它的實現中就要解決這個問題。一個智能指標就是對介面的一個引用,在初始化時需要調用介面的AddRef(),析構時調用Release(),智能指標作為棧上的C++對象總會被析構,就是在發生異常時也是如此,所以對應介面總會被釋放。當智能指標的介面指標被改變時,表示不再引用前一個介面和開始引用後一個介面,所以要對前者調用Release(),對後者調用AddRef()。無關引用計數是智能指標與介面指標的基本區別,在使用上表現為不可通過智能指標調用介面的Release()。在智能指標析構時釋放介面是一種整體上的方案,可以保證介面的釋放,但是有時不能做到及時釋放,所以也要提供途徑讓程式員主動釋放智能指標對應的介面。可以由智能指標本身實現一個類似Release()的函數。智能指標本身定義的函數通過點記法調用。
最後總結一下,智能指標對應介面指標,它與介面指標高度相似,又有重要的區別。相似是為了便於程式員使用,區別則是因為智能指標接管了引用計數的處理。相似體現在:1). 可以通過智能指標的->調用介面中的函數;2). 可以用介面指標給智能指標賦值;等等。區別體現在:1). 不能通過智能指標調用介面的Release();2). 可以通過點記法調用智能指標本身定義的函數,特別是供程式員主動釋放所封裝介面的函數。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/delphicui/archive/2009/05/25/4213811.aspx