首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

智能指標選型指南:所有權轉移 vs 引用計數,功能與實作的雙維度決策

     編輯:關於C語言

條款 3:依功能與實作原理選擇合適的智能指標

智能指標種類繁多,從實作原理可分為兩大類:

  • 基於所有權轉移:std::auto_ptr(C++98/03,C++11 棄用)。賦值給其他指標後自身置空,資源所有權「移交」出去,確保任一時刻僅有一個擁有者。
  • 基於引用計數:boost::shared_ptr(現為 C++11 std::shared_ptr 核心)。內部維護引用計數,拷貝時遞增,析構時遞減,歸零時銷毀資源。

所有權轉移型:簡單但共享不便

auto_ptr<int> ap1(new int(0));
auto_ptr<int> ap2 = ap1; // ap1 置空,所有權移交
cout << *ap1; // 錯誤:ap1 已為 null

優點:簡單、能盡早發現錯誤(不像引用計數錯誤導致難查問題)、明確知道何時釋放。
缺點:資源共享不便、無法放入 STL 容器(STL 採值傳遞,放入容器後原指標即置空,後果嚴重)。

引用計數型:COM 智能指標的自然選擇

COM 本身採用引用計數,且需多指標共享存取組件,故 COM 智能指標皆採此方式:

CComPtr<IX> spIX = NULL;
HRESULT hr = spIX.CoCreateInstance(CLSID_MYCOMPONENT);
if (SUCCEEDED(hr)) {
    spIX->Fx();
    CComPtr<IX> spIX2 = spIX; // 賦值遞增引用計數
    spIX2->Fx();
    spIX->Fx();               // 原指標仍可用
} // 析構時遞減計數,決定是否銷毀資源

功能維度:同樣是引用計數,功能卻大不同

shared_ptr 與 CComPtr 雖同屬「基於引用計數」,但析構行為截然不同:

  • shared_ptr:計數歸零時 delete 指向的記憶體;
  • CComPtr:析構時僅呼叫 COM 介面 Release(),引用計數與組件銷毀由組件自身完成。

明白了這點,你就不會輕易將普通智能指標套用於 COM 介面。

本系列聚焦 COM 技術,重點以 CComPtr、_com_ptr_t 為例。其他類型智能指標請參閱相關文獻自學。接下來,讓我們看看這兩大 COM 智能指標的概覽與通用用法。

—— 作者:liuchang5 的專欄

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved