COM 介面指標需手動 AddRef/Release,極易洩漏或重複釋放導致崩潰。智慧指標以 RAII 封裝管理參考計數,本文解析原理、自製範例、ATL 兩大智慧指標用法與關鍵陷阱。
operator->() 轉發呼叫給內部原始指標。AddRef,解構/賦值時 Release,引用計數歸零自動 delete 內部物件。template<class T>
class JTSmartPointer {
T *m_pData;
RefCount *m_pRef; // 參考計數器(執行緒安全)
public:
JTSmartPointer(T *p) : m_pData(p), m_pRef(new RefCount) { m_pRef->AddRef(); }
JTSmartPointer(const JTSmartPointer& sp) : m_pData(sp.m_pData), m_pRef(sp.m_pRef) { m_pRef->AddRef(); }
~JTSmartPointer() { if (m_pRef && m_pRef->Release() == 0) { delete m_pRef; delete m_pData; } }
T& operator*() { return *m_pData; }
T* operator->() { return m_pData; }
JTSmartPointer& operator=(const JTSmartPointer& sp) { /* 處理自賦值、釋放舊、接管新、AddRef */ }
JTSmartPointer& operator=(T *p) { /* 釋放舊、接管新裸指標、新 RefCount */ }
};
| 特性 | CComPtr<T> | CComQIPtr<T> / CComQIPtr<T, &IID> |
|---|---|---|
| 功能 | 基本智慧指標 | 含 QueryInterface 能力,建構/賦值自動 QI |
| 支援 IUnknown | 是 | 需顯式指定 IID:CComQIPtr<IUnknown, &IID_IUnknown> |
| 適用場景 | 已知確切介面 | 需動態查詢介面、跨介面轉換 |