[C++11]shared_ptr共享智能指针的初始化与使用
使用智能指針需要添加頭文件:
代碼如下:
#include <memory>shared_ptr使用的注意事項:
1.不能使用一個原始地址初始化多個共享智能指針
2.函數不能返回管理了this的共享智能指針對象
3.共享智能指針不能循環引用
初始化:
1.通過構造函數初始化
代碼如下:
std::shared_ptr<T> 智能指針名字(創建堆內存)2.通過拷貝和移動構造函數初始化
代碼如下:
#include <iostream> #include <memory> using namespace std;int main() {// 使用智能指針管理一塊 int 型的堆內存, 內部引用計數為 1shared_ptr<int> ptr1(new int(520));cout << "ptr1管理的內存引用計數: " << ptr1.use_count() << endl;//調用拷貝構造函數shared_ptr<int> ptr2(ptr1);cout << "ptr2管理的內存引用計數: " << ptr2.use_count() << endl;shared_ptr<int> ptr3 = ptr1;cout << "ptr3管理的內存引用計數: " << ptr3.use_count() << endl;//調用移動構造函數shared_ptr<int> ptr4(std::move(ptr1));cout << "ptr4管理的內存引用計數: " << ptr4.use_count() << endl;std::shared_ptr<int> ptr5 = std::move(ptr2);cout << "ptr5管理的內存引用計數: " << ptr5.use_count() << endl;return 0; }/*作者: 蘇丙榅 鏈接: https://subingwen.cn/cpp/shared_ptr/#1-2-%E9%80%9A%E8%BF%87%E6%8B%B7%E8%B4%9D%E5%92%8C%E7%A7%BB%E5%8A%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E5%88%9D%E5%A7%8B%E5%8C%96 來源: 愛編程的大丙*/3.通過std::make_shared初始化
代碼如下:
通過 C++ 提供的 std::make_shared() 就可以完成內存對象的創建并將其初始化給智能指針,函數原型如下:
template<typename T,typename ...Args> shared_ptr<T>make_shared(Args&&...args);- T:模板參數的數據類型
- Args&&… args :要初始化的數據,如果是通過 make_shared 創建對象,需按照構造函數的參數列表指定
4.通過reset方法初始化
共享智能指針類提供的 std::shared_ptr::reset 方法函數原型如下:
void reset() noexcept;template< class Y > void reset( Y* ptr );template< class Y, class Deleter > void reset( Y* ptr, Deleter d );template< class Y, class Deleter, class Alloc > void reset( Y* ptr, Deleter d, Alloc alloc );/*作者: 蘇丙榅 鏈接: https://subingwen.cn/cpp/shared_ptr/#1-3-%E9%80%9A%E8%BF%87std-make-shared%E5%88%9D%E5%A7%8B%E5%8C%96 來源: 愛編程的大丙*/- ptr:指向要取得所有權的對象的指針
- d:指向要取得所有權的對象的指針
- aloc:內部存儲所用的分配器
reset兩個功能:
1.讓指向某塊內存的智能指針解除對這片內存的管理
2.通過reset調用,讓一個指向某塊內存的智能指針指向另塊一塊內存,也就是讓它去管理另外一塊內存。
兩個函數:
如果想要查看當前有多少個智能指針同時管理著這塊內存可以使用共享智能指針提供的一個成員函數 use_count,函數原型如下:
// 管理當前對象的 shared_ptr 實例數量,或若無被管理對象則為 0。 long use_count() const noexcept;獲取原始指針
對應基礎數據類型來說,通過操作智能指針和操作智能指針管理的內存效果是一樣的,可以直接完成數據的讀寫。但是如果共享智能指針管理的是一個對象,那么就需要取出原始內存的地址再操作,可以調用共享智能指針類提供的 get () 方法得到原始地址,其函數原型如下:
T* get() const noexcept;代碼如下:
#include <iostream> #include <memory> #include <string> using namespace std;class Test { public:Test(){cout << "construct" << endl;}Test(int x) :m_num(x){cout << "construct x = " << x << endl;}Test(string str){cout << "construct str = " << str << endl;}~Test(){cout << "destruct" << endl;}void setValue(int v){m_num = v;}void print(){cout << "m_num = " << m_num << endl;}private:int m_num; };int main() {//通過構造函數初始化shared_ptr<int>ptr1(new int(3));cout << "ptr1 use_count = " << ptr1.use_count() << endl;//通過移動構造和拷貝構造函數初始化shared_ptr<int>ptr2 = move(ptr1);cout << "ptr1 use_count = " << ptr1.use_count() << endl;cout << "ptr2 use_count = " << ptr2.use_count() << endl;shared_ptr<int>ptr3 = ptr2;cout << "ptr3 use_count = " << ptr3.use_count() << endl;cout << "ptr2 use_count = " << ptr2.use_count() << endl;//通過std::make_shared初始化shared_ptr<int>ptr4 = make_shared<int>(8);shared_ptr<Test>ptr5 = make_shared<Test>(8);cout << "ptr5 use_count = " << ptr5.use_count() << endl;shared_ptr<Test>ptr6 = make_shared<Test>("hello");cout << "ptr6 use_count = " << ptr6.use_count() << endl;//通過reset初始化ptr6.reset();cout << "ptr6 use_count = " << ptr6.use_count() << endl;ptr5.reset(new Test("world"));cout << "ptr5 use_count = " << ptr5.use_count() << endl;return 0; }測試結果:
shared_ptr的使用:
代碼如下:
#include <iostream> #include <memory> #include <string> using namespace std;class Test { public:Test(){cout << "construct" << endl;}Test(int x) :m_num(x){cout << "construct x = " << x << endl;}Test(string str){cout << "construct str = " << str << endl;}~Test(){cout << "destruct" << endl;}void setValue(int v){m_num = v;}void print(){cout << "m_num = " << m_num << endl;}private:int m_num; };int main() {//通過構造函數初始化shared_ptr<int>ptr1(new int(3));cout << "ptr1 use_count = " << ptr1.use_count() << endl;//通過移動構造和拷貝構造函數初始化shared_ptr<int>ptr2 = move(ptr1);cout << "ptr1 use_count = " << ptr1.use_count() << endl;cout << "ptr2 use_count = " << ptr2.use_count() << endl;shared_ptr<int>ptr3 = ptr2;cout << "ptr3 use_count = " << ptr3.use_count() << endl;cout << "ptr2 use_count = " << ptr2.use_count() << endl;//通過std::make_shared初始化shared_ptr<int>ptr4 = make_shared<int>(8);shared_ptr<Test>ptr5 = make_shared<Test>(8);cout << "ptr5 use_count = " << ptr5.use_count() << endl;shared_ptr<Test>ptr6 = make_shared<Test>("hello");cout << "ptr6 use_count = " << ptr6.use_count() << endl;//通過reset初始化ptr6.reset();cout << "ptr6 use_count = " << ptr6.use_count() << endl;ptr5.reset(new Test("world"));cout << "ptr5 use_count = " << ptr5.use_count() << endl;//獲取原始指針Test *t = ptr5.get();t->setValue(1000);t->print();//直接使用ptr5->setValue(999);ptr5->print();return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的[C++11]shared_ptr共享智能指针的初始化与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TrendForce:去年全球 SSD
- 下一篇: [C++11]弱引用智能指针weak_p