[C++11]shared_ptr共享智能指针的初始化与使用
使用智能指針需要添加頭文件:
代碼如下:
#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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TrendForce:去年全球 SSD
- 下一篇: 豆芽汤的功效与作用、禁忌和食用方法