智能指針

關鍵點##

RAII機制

C++操作符重載

參考鏈接##

C++11智能指針之unique_ptr

shared_ptr

shared_ptr的幾點注意點

智能指針weak_ptr

cpluscplus

unique_ptr智能指針##

生命周期###

unique_ptr生命周期,與普通的數據類型相同,一旦離開作用域,如果其指向對象,
就會將指向的對象進行銷毀。

unique_ptr特點在于其“獨占”的特點,同一時刻
unique_ptr指向的對象只能有一個引用,不能存在多個unique_ptr指向同一個對象

基本操作###

//后期綁定
unique_ptr<int> ui;
ui.reset(new int(1));
//創建時動態綁定
unique_ptr<int> ui2(new int(1));
//釋放所有權
int* pi = ui2.release();
//轉移所有權
unique_ptr<string> us(new string("abc"));
unique_ptr<string> us2 = std::move(us);
//主動銷毀
us2 = nullptr

shared_ptr##

生命周期###

shared_ptr生命周期在離開作用域時,會將其指向對象的引用計數減一,
如果發現引用計數已經歸〇,那么將會把其引用的對象進行進行銷毀。

shared_ptr的特點在于“引用計數”,每當有一個shared_ptr
指針指向相同的對象的時候,將會把引用計數增加1,每當指向對象的shared_ptr被銷毀時,
將會把引用計數減少1,當引用計數減少為0時,將會把對象銷毀。

基本操作

//創建的時動態綁定
shared_ptr<int> sp(new int(10));
//通過拷貝
shared_ptr<int> sp1 = sp;
//停止引用對象
sp.reset();
//銷毀釋放
sp1 = nullptr;

注意###

由于其使用引用計數的方式進行引用對象的釋放,所以可能存在環狀鏈式結構造成內存的泄露。
這種時候需要使用另一個智能指針weak_ptr解決這種情況。c++無法想java那樣自動判斷并
釋放環狀鏈式結構,所以在使用上還是得需要小心處理。

由于其內部加減引用計數不是線程安全,所以在多線程使用時需要自己添加加鎖操作以保證
其引用計數的正確性。

weak_ptr##

生命周期###

嚴格來說,weak_ptr并不像shared_ptr以及unique_ptr一樣存在生命周期這總說法,因為
其內部不進行引用對象的釋放,也無法直接進行引用對象的解引用以及->操作。其如果需要
進行引用對象的操作,需要使用lock函數獲取一個shared_ptr指針,然后性shared_ptr一
樣進行使用。

weak_ptr的特點在于“輔助”shared_ptr指針的使用,其最大
的作用在于解決shared_ptr環狀引用的問題。

基本操作

//引用對象
shared_ptr<int> sp(new int(1));
weak_ptr<int> wp(sp);
//判斷是否失效
if (wp.expired())
{
    //未失效
    //獲取一個Shared_ptr對象進行使用
    shared_ptr<int> sp1 = wp.lock();
    *sp1 = 0;
}
else
{
    //已經失效
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 原作者:Babu_Abdulsalam 本文翻譯自CodeProject,轉載請注明出處。 引入### Ooops...
    卡巴拉的樹閱讀 30,162評論 13 74
  • 1. 什么是智能指針? 智能指針是行為類似于指針的類對象,但這種對象還有其他功能。 2. 為什么設計智能指針? 引...
    MinoyJet閱讀 645評論 0 1
  • 導讀## 最近在補看《C++ Primer Plus》第六版,這的確是本好書,其中關于智能指針的章節解析的非常清晰...
    小敏紙閱讀 2,016評論 1 12
  • 專屬所有權:unique_ptr 我們大多數場景下用到的應該都是 unique_ptr。 unique_ptr 代...
    wayyyy閱讀 1,239評論 0 1
  • C++智能指針 原文鏈接:http://blog.csdn.net/xiaohu2022/article/deta...
    小白將閱讀 6,884評論 2 21