日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

智能指针的总结

發(fā)布時間:2024/3/26 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 智能指针的总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

      • 定義
      • 分類
      • 智能指針的使用
        • `shared_ptr`
        • `weak_ptr`
        • `unique_ptr`
        • 常見的陷阱
      • 總結(jié)
      • 參考地址

定義

智能指針是對象,不是指針。它是通過c++的RAII機(jī)制實現(xiàn)的,主要是利用c++對象在釋放資源的時候,會自動調(diào)用析構(gòu)函數(shù)這一特性。

分類

auto_ptr: 智能指針,c++11已經(jīng)停用;

shared_ptr: 強(qiáng)智能指針,可以改變資源的引用計數(shù);

weak_ptr: 弱智能指針,不會改變資源的引用計數(shù);

unique_ptr: 獨占式強(qiáng)智能指針,只能轉(zhuǎn)移,不能重新賦值;

智能指針的使用

shared_ptr

原理

shared_ptr采用了引用計數(shù)器,允許多個指針指向同一個對象。每一個shared_ptr的拷貝都指向相同的內(nèi)存,并共同維護(hù)同一個引用計數(shù)器,記錄統(tǒng)一使用被引用的次數(shù)。每增加一個shared_ptr智能指針對象,new對象指針的引用計數(shù)上就加1,當(dāng)shared_ptr智能指針失效時,new對象指針的引用計數(shù)就減1。引用計數(shù)歸0時,shared_ptr會釋放管理的內(nèi)存空間。

shared_ptr包含2個指針,一個是指向管理的內(nèi)存空間,一個是指向內(nèi)存的控制塊。

內(nèi)存控制塊包含引用計數(shù)器,刪除器,分配器等。

class Test { public:Test();~Test();void setFather(std::shared_ptr<Test> &value) {m_father = value;}void setSon(std::shared_ptr<Test> &value) {m_son = value;}private:std::shared_ptr<Test> m_father;std::shared_ptr<Test> m_son; };void test() {Test *ps = new Test();std::shared_ptr<Test> ptr1(ps);std::shared_ptr<Test> ptr2(ps);ptr1->setFather(ptr2);ptr2->setSon(ptr1);//計數(shù)std::cout << ptr1.use_count() << endl;//計數(shù)std::cout << ptr2.use_count() << endl;//計數(shù)獲取原始指針std::cout << ptr1.get() <<endl;std::cout << ptr2.get() <<endl; }輸出: Test Construct() 2 2 0xfe1740 0xfe1740

從輸出信息中可以看到并未調(diào)用析構(gòu)函數(shù)。主要是因為互相引用導(dǎo)致。

示例2 測試引用計數(shù)問題

//測試shared_ptr的引用計數(shù) void testSharedPtrCount() {//不要使用該方式初始化Test *ps = new Test();std::shared_ptr<Test> ptr1(ps);std::shared_ptr<Test> ptr2(ps);//計數(shù)std::cout << ptr1.use_count() << endl;std::cout << ptr2.use_count() << endl;std::shared_ptr<Test> ptr3(new Test());std::shared_ptr<Test> ptr4 = ptr3;//計數(shù)std::cout << ptr3.use_count() << endl;std::cout << ptr4.use_count() << endl; }輸出: 1 1 2 2

可以看到使用同一個對象指針初始化的時候,引用計數(shù)為1,而使用智能指針初始化智能指針后,引用計數(shù)均為2。

智能指針的頭文件為:#include

weak_ptr

weak_ptr不能單獨作為智能指針使用,只能輔助shared_ptr解決循環(huán)依賴的問題。

定義對象的時候使用shared_ptr,引用對象的時候使用weak_ptr。

修改shared_ptr的代碼為:

class Test { public:Test();~Test();void setFather(std::shared_ptr<Test> &value) {m_father = value;}void setSon(std::shared_ptr<Test> &value) {m_son = value;}private://修改對象的引用為weak_ptrstd::weak_ptr<Test> m_father;std::weak_ptr<Test> m_son; };輸出: Test Construct() 1 1 0x1091740 0x1091740 Test Destruct() Test Destruct()

可以看到析構(gòu)函數(shù)被調(diào)用了。(即使析構(gòu)了2次,部分編譯器可能不會出現(xiàn)析構(gòu)錯誤信息)

unique_ptr

unique_ptr是獨占型的強(qiáng)智能指針。獨占型就是不允許多個智能指針指向同一塊內(nèi)存空間,也不支持拷貝,復(fù)制。

示例1 獨占性

//測試uniqueptr void testUniquePtr() {Test *ps = new Test();std::unique_ptr<Test> ptr1(ps);//編譯期間就出現(xiàn)錯誤std::unique_ptr<Test> ptr2 = ptr1;std::cout << ptr1.get() << endl;std::cout << ptr2.get() << endl; }

**示例2 move **

//測試unique_ptr的轉(zhuǎn)移 void testUniquePtrMove() {Test *ps = new Test();std::unique_ptr<Test> ptr1(ps);std::cout << "Ptr1: " << ptr1.get() << endl;std::unique_ptr<Test> ptr2(ps);ptr2 = std::move(ptr1);std::cout << "Ptr1: " << ptr1.get() << endl;std::cout << "Ptr2: " << ptr2.get() << endl; }//輸出 Test Construct() Ptr1: 0x761740 Test Destruct() Ptr1: 0 Ptr2: 0x761740 Test Destruct()

可以看出調(diào)用move()后,ptr1被置為nullptr(0), ptr2被設(shè)置為0x761740。

常見的陷阱

  • 不要使用指針初始化多個智能指針。

  • 不要delete get()返回的指針。

總結(jié)

  • 智能指針是對象而不是指針。
  • 智能指針解決的是動態(tài)內(nèi)存管理的問題(堆內(nèi)存)。
  • shared_ptr的循環(huán)依賴問題通過weak_ptr來解決,weak_ptr不擁有對象的所有權(quán),一個share_ptr可對應(yīng)多個weak_ptr。
  • unique_ptr可算作auto_ptr的翻版,不允許多個unique_ptr持有同一個對象。
  • auto_ptr已經(jīng)被棄用。
  • 參考地址

    C++ 智能指針

    c++智能指針

    C++智能指針的使用(非常詳細(xì))

    C++智能指針詳解

    總結(jié)

    以上是生活随笔為你收集整理的智能指针的总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。