1. 程式人生 > >C++11 智慧指標之 std::shared_ptr 初級學習

C++11 智慧指標之 std::shared_ptr 初級學習

shared_ptr概念

  • shared_ptr基於“引用計數”模型實現,多個shared_ptr可指向同一個動態物件,並維護了一個共享的引用計數器,記錄了引用同一物件的shared_ptr例項的數量。當最後一個指向動態物件的shared_ptr銷燬時,會自動銷燬其所指物件(通過delete操作符)。

  • shared_ptr的預設能力是管理動態記憶體,但支援自定義的Deleter以實現個性化的資源釋放動作。

shared_ptr的建立

  • std:make_shared 方式
std:shared_ptr<std:string> a = std:make_shared<std
:string>("hello");
  • 建構函式方式
std:shared_ptr<std:string> a(new std:string("hello"));

簡單測試程式碼

#include <iostream>
#include <memory>

using namespace std;

class A{
private:
    int x;
public:
    A(int x):x(x){}
    void print()
    {
        cout<<"x="<<x<<endl;
    }
    ~A()
    {
        cout
<<"x="<<x<<" deleted"<<endl; } }; class B { public: void testB(shared_ptr<A> a) { cout<<"fourth count="<<a.use_count()<<endl; a->print(); } }; void testA(shared_ptr<A> a) { cout<<"testA count="<<a.use_count()<<endl; a->print(); } shared_ptr
<A> testC() { shared_ptr<A> a = make_shared<A>(2); return a; } void testD(shared_ptr<A> &a) { cout<<"testD count="<<a.use_count()<<endl; a->print(); } int main() { shared_ptr<A> a(new A(1)); { a->print(); cout<<"first count="<<a.use_count()<<endl; shared_ptr<A> aa = a; cout<<"second count="<<a.use_count()<<endl; cout<<"second count="<<aa.use_count()<<endl; testA(a); cout<<"after testA count="<<a.use_count()<<endl; B c; c.testB(a); } cout<<"first over count="<<a.use_count()<<endl; shared_ptr<A> b = testC(); cout<<"after testC count="<<b.use_count()<<endl; testD(b); return 0; }

輸出結果
這裡寫圖片描述

可以看到shared_ptr作為形參的時候(testA和testB)use_count會增加1,但退出函式後回到原來的use_count,但作為引用傳遞的時候(testD)並不會增加use_count