為什麼智慧型指標還需要 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). 可以通過點記法呼叫智慧型指標本身定義的函式,特別是供程式設計師主動釋放所封裝介面的函式。
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
智慧型指標(二)智慧型指標的方法和構造
預設構造shared ptrsp和unique ptrup 指標構造shared ptrsp t 和unique ptrup t 這裡預設為explicit 帶刪除器的構造shared ptrp q,d q這裡可以內建指標和智慧型指標,同時將用d析構器代替delete。所以定義了這麼乙個帶刪除器的建...
c 智慧型指標的問題 智慧型指標初探(一)
為什麼要有智慧型指標 在c 中,動態記憶體的管理一般是用一對運算子完成的 new和delete。new 在動態記憶體中為物件分配一塊空間並返回乙個指向該物件的指標。delete 指向乙個動態獨享的指標,銷毀物件,並釋放與之關聯的記憶體。使用new和delete動態記憶體管理經常會出現問題 忘記釋放記...