C++11 智慧指標之 std::shared_ptr 初級學習
阿新 • • 發佈:2019-02-11
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