日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

[C++11]shared_ptr共享智能指针的初始化与使用

發(fā)布時間:2023/12/4 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C++11]shared_ptr共享智能指针的初始化与使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用智能指針需要添加頭文件:

代碼如下:

#include <memory>

shared_ptr使用的注意事項:
1.不能使用一個原始地址初始化多個共享智能指針
2.函數(shù)不能返回管理了this的共享智能指針對象
3.共享智能指針不能循環(huán)引用

初始化:

1.通過構(gòu)造函數(shù)初始化

代碼如下:

std::shared_ptr<T> 智能指針名字(創(chuàng)建堆內(nèi)存)

2.通過拷貝和移動構(gòu)造函數(shù)初始化

代碼如下:

#include <iostream> #include <memory> using namespace std;int main() {// 使用智能指針管理一塊 int 型的堆內(nèi)存, 內(nèi)部引用計數(shù)為 1shared_ptr<int> ptr1(new int(520));cout << "ptr1管理的內(nèi)存引用計數(shù): " << ptr1.use_count() << endl;//調(diào)用拷貝構(gòu)造函數(shù)shared_ptr<int> ptr2(ptr1);cout << "ptr2管理的內(nèi)存引用計數(shù): " << ptr2.use_count() << endl;shared_ptr<int> ptr3 = ptr1;cout << "ptr3管理的內(nèi)存引用計數(shù): " << ptr3.use_count() << endl;//調(diào)用移動構(gòu)造函數(shù)shared_ptr<int> ptr4(std::move(ptr1));cout << "ptr4管理的內(nèi)存引用計數(shù): " << ptr4.use_count() << endl;std::shared_ptr<int> ptr5 = std::move(ptr2);cout << "ptr5管理的內(nèi)存引用計數(shù): " << 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() 就可以完成內(nèi)存對象的創(chuàng)建并將其初始化給智能指針,函數(shù)原型如下:

template<typename T,typename ...Args> shared_ptr<T>make_shared(Args&&...args);
  • T:模板參數(shù)的數(shù)據(jù)類型
  • Args&&… args :要初始化的數(shù)據(jù),如果是通過 make_shared 創(chuàng)建對象,需按照構(gòu)造函數(shù)的參數(shù)列表指定

4.通過reset方法初始化

共享智能指針類提供的 std::shared_ptr::reset 方法函數(shù)原型如下:

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:指向要取得所有權(quán)的對象的指針
  • d:指向要取得所有權(quán)的對象的指針
  • aloc:內(nèi)部存儲所用的分配器

reset兩個功能:

1.讓指向某塊內(nèi)存的智能指針解除對這片內(nèi)存的管理

2.通過reset調(diào)用,讓一個指向某塊內(nèi)存的智能指針指向另塊一塊內(nèi)存,也就是讓它去管理另外一塊內(nèi)存。

兩個函數(shù):

如果想要查看當(dāng)前有多少個智能指針同時管理著這塊內(nèi)存可以使用共享智能指針提供的一個成員函數(shù) use_count,函數(shù)原型如下:

// 管理當(dāng)前對象的 shared_ptr 實例數(shù)量,或若無被管理對象則為 0。 long use_count() const noexcept;

獲取原始指針

對應(yīng)基礎(chǔ)數(shù)據(jù)類型來說,通過操作智能指針和操作智能指針管理的內(nèi)存效果是一樣的,可以直接完成數(shù)據(jù)的讀寫。但是如果共享智能指針管理的是一個對象,那么就需要取出原始內(nèi)存的地址再操作,可以調(diào)用共享智能指針類提供的 get () 方法得到原始地址,其函數(shù)原型如下:

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() {//通過構(gòu)造函數(shù)初始化shared_ptr<int>ptr1(new int(3));cout << "ptr1 use_count = " << ptr1.use_count() << endl;//通過移動構(gòu)造和拷貝構(gòu)造函數(shù)初始化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; }

測試結(jié)果:

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() {//通過構(gòu)造函數(shù)初始化shared_ptr<int>ptr1(new int(3));cout << "ptr1 use_count = " << ptr1.use_count() << endl;//通過移動構(gòu)造和拷貝構(gòu)造函數(shù)初始化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; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的[C++11]shared_ptr共享智能指针的初始化与使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。