ATL和vc++中的智能指針(分別是CComPtr和_com_ptr_t)
一、智能指針的概念
智能指針是一個類,不是指針,智能指針在所包含的指針不再被使用時候會自動釋放該所包含指針所占用的系統資源,而不用手動釋放。
原理:智能指針封裝了包含指針的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.https://blog.csdn.net/liuzhi1218/article/details/5996969
ATL和vc++中的智能指針(分別是CComPtr和_com_ptr_t)