unique_ptr 智能指針篇
簡介:
作爲智能指針的一種,被設計出來最關鍵的目的就是解決原生指針安全性不足的問題
聲明語法:
std::unique_ptr<類型> 變量名 {初始化值};
注意點: 最好配合std::make_unique來初始化unique_ptr
舉例如下:
第一種:
// 初始化一個數據類型空間,括號內爲初始化的值
std::unique_ptr<int> upa{ std::make_unique<int>(150) };
std::cout << "upa = " << *upa << std::endl;
結果:
第二種:
//初始化許多個數據類型空間,圓括號內爲初始化空間個數,這裏即可放10個int
std::unique_ptr<int[]> upb{ std::make_unique<int[]>(10) };
upb[0] = 10; upb[1] = 20; //一看就懂
std::cout << "upb[0] = " << upb[0] << " upb[1] = " << upb[1]<< std::endl;
結果:
重要特性:
此指針的特性跟他的名字一樣具有唯一性,即無法讓兩個以上unique指針指向相同的內存地址。
來個錯誤的例子:
std::unique_ptr<int> upa{ std::make_unique<int>(20) }; //第一個unique指針
std::unique_ptr<int> upb{ upa }; //初始化時指向第一個,直接報錯,編譯過不去
常用方法:
1、get()
簡介: 返回unique的原生指針!怎麼理解?請看下面:
std::unique_ptr<int> upa{ std::make_unique<int>(20) };
int* pa = upa.get(); //定義一個原生指針接收它就可以了
std::cout << "pa=" << *pa << std::endl;
結果:
2、reset()
簡介: 釋放unique指針的內存空間,並且將指針指向nullptr(c++11及其以上)
舉例如下:
std::unique_ptr<int> upa{ std::make_unique<int>(20) };
upa.reset(); //釋放內存並且指向nullptr
std::cout << upa << std::endl;
結果:
3、release()
簡介: 返回原unique指針指向的內存地址,但是將unique指針指向空,如何理解?
舉例如下:
std::unique_ptr<int> upa{ std::make_unique<int>(20) };
std::cout << "原upa地址=" << upa << std::endl;
int * a = upa.release();
std::cout << "a地址="<< a << std::endl;
std::cout << "新upa地址=" << upa << std::endl;
結果:
4、std::move(unique_ptr)
簡介: 爲了解決unique唯一性而不能轉移到另一個unique的特性
舉例如下:
std::unique_ptr<int> upa{ std::make_unique<int>(20) };
std::unique_ptr<int> upb{};
std::cout << "原upa==" << upa << std::endl;
upb = std::move(upa);
std::cout << "upb==" << upb << std::endl;
std::cout << "新upa==" << upa << std::endl;
結果:
注意點: 它不是類的方法,而是std標準庫裏的函數;與get不同的是,他是直接轉移到李剛一個unique指針上,而get是轉移到原生指針!
sharedx_ptr 智能指針篇
簡介:
不同於unique,他可以定義很多個shared指針指向同一個地址;智能在什麼地方麼?只有當最後一個shared指針釋放的時候,這塊內存纔會釋放!並且可以記錄當前地址有多少智能指針調用
聲明語法:
std::sharedx_ptr<類型> 變量名 {初始化值};
注意點: 最好配合std::make_shared來初始化shared_ptr
舉例如下:
//第一種,跟unique一樣的形式,只是把unique換成shared
std::shared_ptr<int> spa{ std::make_shared<int>(50) };
//第二種 這種方法不行,用第三種替換
//std::shared_ptr<int[]> spb{ std::make_shared<int[]>(4) };
//第三種 //用new申請數組形式替代即可
std::shared_ptr<int[]> spc{ new int[4]{1,2,3,4} };
常用方法:
1、use_count()
簡介: 返回當前地址有多少shared_ptr調用
代碼:
std::shared_ptr<int> spa{ std::make_shared<int>(50) };
std::cout << spa.use_count() << std::endl; //1
std::shared_ptr<int> spb{ spa };
std::cout << spa.use_count() << std::endl; //2
std::shared_ptr<int> spc{ spa };
std::cout << spa.use_count() << std::endl; //3
結果:
2、unique()
簡介:
原型: bool std::shared_ptr.unique();
說明: 若該shared_ptr是唯一的指向該區域的shared指針,返回true,否則返回false
代碼:
std::shared_ptr<int> spa{ std::make_shared<int>(50) };
std::cout << spa.unique() << " "; //唯一
std::shared_ptr<int> spb{ spa };
std::cout << spa.unique() << " "; //不唯一
std::shared_ptr<int> spc{ spa };
std::cout << spa.unique() << " "; //不唯一
結果:
3、reset()
簡介: 設置當前共享指針爲nullptr,若是最後一個,則會釋放內存
代碼:
std::shared_ptr<int> spa{ std::make_shared<int>(50) };
std::shared_ptr<int> spb{ spa };
std::shared_ptr<int> spc{ spa };
spa.reset(); std::cout << spb << " "; //還沒釋放內存
spb.reset(); std::cout << spc << " ";//還沒釋放內存
spc.reset(); std::cout << spc << " ";//釋放內存
結果:
再次感謝自己努力的拼搏!!老鐵們覺得不錯的點點贊哦!我是航行的土豆,謝謝!