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")相比,有什麼好處呢:
看下面兩張圖:記憶體配置設定可以一次性完成. 這減少了記憶體配置設定的次數, 而記憶體配置設定是代價很高的操作.
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CMzgzNzQDNkJWZxEDZwQTZyYzXxQDOzADMwMzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)