天天看點

shared_ptr 和 make_shared 的使用

 std::shared_ptr

是一種智能指針(本身就是一個對象),指向一個對象。它能夠記錄多少個 shared_ptr 共同指向一個對象,進而消除顯示的調用 delete,當引用計數變為零的時候就會将對象自動删除。

std::shared_ptr 可以通過 get() 方法來擷取原始指針,通過 reset() 來減少一個引用計數, 并通過use_count()來檢視一個對象的引用計數。

//建立了一個 40位元組記憶體空間 的對象,pointer 指向這個對象
std::shared_ptr pointer = new int(10);     
std::shared_ptr pointer2 = pointer; // pointer2  也指向這個對象,且引用計數+1

int *p = pointer.get(); // 這樣不會增加引用計數
std::cout << "pointer.use_count() = " << pointer.use_count() << std::endl; // 3
std::cout << "pointer2.use_count() = " << pointer2.use_count() << std::endl; // 3


//建立一個指針ptrB 棧對象,構造函數中沒有任何參數,是以預設指向的是null。
std::shared_ptr<int> ptrB();
 
//這種寫法也可以,{}表示賦初值或者說初始化,其它類型變量定義也是如此,是c++11的文法特性
std::shared_ptr<int> ptrB{std::make_shared<int>(5)};      

注意:​

​std::make_shared​

​不支援數組。

std::make_shared

主要功能是在動态記憶體中配置設定一個對象并初始化它,傳回指向此對象的shared_ptr。

//p1指向一個值為"9999999999"的string對象
shared_ptr<string> p1 = make_shared<string>(10, '9');

//p2指向一個值為"hello"的string對象
shared_ptr<string> p2 = make_shared<string>("hello");

//p2指向一個為空的string對象
shared_ptr<string> p3 = make_shared<string>();

//這種寫法也可以,{}表示賦初值或者說初始化,其它類型變量定義也是如此,是c++11的文法特性
std::shared_ptr<int> ptrB{std::make_shared<int>(5)};      

和上面直接使用 new<string>("hello")相比,有什麼好處呢:

看下面兩張圖:記憶體配置設定可以一次性完成. 這減少了記憶體配置設定的次數, 而記憶體配置設定是代價很高的操作.

shared_ptr 和 make_shared 的使用
shared_ptr 和 make_shared 的使用

繼續閱讀