標籤:系統 targe tar 介面實現 包含 com int 類對象 art
一、智能指標的概念
智能指標是一個類,不是指標,智能指標在所包含的指標不再被使用時候會自動釋放該所包含指標所佔用的系統資源,而不用手動釋放。
原理:智能指標封裝了包含指標的AddRef()函數和Release()函數,且在該類不被需要的時候在解構函式裡調用包含指標的Release()函數釋放包含指標的資源。因此實質是利用類的析構達到調用包含指標的Release()函數的目的。
二、VC++中的智能指標:_com_ptr_t
_com_ptr_t實質是一個類模板。使用它時需要提供三個參數:介面的名稱,介面的IID和實作類別的CLSID。(其實和使用CoCreateInstance需要的參數差不多)
1.步驟:
1.定義一個智能指標:_COM_SMATRTPTR_TYPEDEF(IMyInterface,__uuidof(IMyInterface));
參數1:被包含的介面的名稱;
參數2:被包含的介面的GUID值。
上面這個宏會自動為我們產生一個叫IMyInterfacePtr的智能指標(是個類),有了這個類,我們就可以定義類對象調用介面內的函數了。
2.定義一個智能指標對象:
IMyInterfacePtr pMyInterface;
3.執行個體化實現該介面的類。
方法一:pMyInterface.CreateInterface(__uuidof(MyInterface));//假設MyInterface是實現了IMyInterface介面的類。
方法二:pMyInterface(__uuidof(MyInterface));//因為智能指標建構函式裡會自動調用CreateInstance()函數,所以直接提供實作類別的guid即可。
4.調用介面的指標。
pMyInterface->show();
注意:智能指標析構的時候會自動調用介面的Release()函數,實作類別MyInterface資源的釋放,因此不用再調用Release()了,如果不放心,也可以調用。
即pMyInterface.Release();//注意中間是點操作符號,不是->操作符號。
2.為何智能指標又可以用.操作符,又可以用->操作符:
用.操作符是智能指標類調用自己的方法,用->操作符是調用包含介面的方法,因為智能指標類有個變數m_pInterface用來儲存包含的介面,實質是pWisePtr.m_pInterface->method()。
智能指標的優點:
1.我們在調用CreateInstance()產生介面實作類別對象時候,會自動調用智能指標一個_Release()的私人函數,使得之前的介面無條件被釋放(引用數減1)。
2.智能指標內儲存了一個m_pInterface的Interface*類型的指標,用於儲存所包含的介面的指標。指標指標調用介面函數,實質就是該變數調用的結果。
三、我們只要知道怎麼用
1.智能指標不用釋放,當程式不需要的時候智能指標自動析構,析構中自動將所包含介面的引用數減少1;
2.通過宏_COM_SMATRTPTR_TYPEDEF(IMyInterface,__uuidof(IMyInterface))建立智能指標;
3.ADO、WORD、EXCEL等程式提供的都是智能指標,別在迷糊了。
參考文獻:
1.https://www.cnblogs.com/coderlee/archive/2008/02/18/1071755.html
2.5996969
ATL和vc++中的智能指標(分別是CComPtr和_com_ptr_t)