c++之獨立和共享智能指針學習篇

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 << " ";//釋放內存

結果:
在這裏插入圖片描述
再次感謝自己努力的拼搏!!老鐵們覺得不錯的點點贊哦!我是航行的土豆,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章