智能指標的釋放

來源:互聯網
上載者:User

 為什麼智能指標還需要 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.