5-6 unique_ptr概述、常用操作

006unique_ptr概述和常見操作

#include<iostream>
#include<cstdlib>
#include<string>
#include<vector>
#include <memory>

using namespace std;

class A
{
public:
	A(){}
	~A()
	{
		;
	}
};

auto myFunction()
{
	return unique_ptr<string>(new string("jisuanjiz"));//這是個右值
	//臨時對象都是右值
}

int main(void)
{
	unique_ptr<int>p1;//指向一個空指針
	if (p1==nullptr)
	{
		cout << "p1是空指針" << endl;

	}
	unique_ptr<int>p2(new int(34354));//p2指向一個值爲34354的int對象
	//make_unique c++14中引入,不需要指定刪除器的時候選擇這個
	unique_ptr<int>p3 = make_unique<int>(234);
	auto p4 = make_unique<int>(200);//p4是一個智能指針

	//2.1
	unique_ptr<string>p5(new string("jisuanjizuchengyaunli"));
	//智能指針不支持拷貝動作,也不支持賦值操作
	//unique_ptr<string> p6(p5);//error
	//unique_ptr<string>p7 = p5;//error

	//2.2移動語義
	unique_ptr<string>p8 = std::move(p5);//p5爲空,p8指向原來的內存空間

	//2.3 release()釋放
	unique_ptr<string>p9(p5.release());//使用p5的裸指針來初始化p9
	string *p10 = p9.release();
	delete p10;//一旦release()就需要手工釋放
	
	//2.4
	unique_ptr<string>p11(new string("dsfsdf"));
	//p11.reset();//釋放內存空間,
	p11.reset(p5.release());//release釋放p5指向的內存空間的聯繫,同時p11指向這個空間
	
	//2.5nullptr
	unique_ptr<int>p12(new int(234));
	p12 = nullptr;

	//*2.6指向一個數組
	unique_ptr<int[]>pArray(new int[123]);
	pArray[0] = 0;
	pArray[1] = 0;

	unique_ptr<A[]>pAA(new A[10]);//當有自己的析構函數<>裏面必須加上[],否則會報異常

	//2.7get() 返回智能指針中返回的裸指針
	//注意得到裸指針不要釋放內存空間,讓智能指針自己釋放更好,否則會釋放2次出錯
	
	

	//2.11 轉換成shared_ptr類型,轉換後賦值
	shared_ptr<string>p13 = myFunction();

	
	system("pause");
	return 0;
}

/*
*(1)unique_ptr獨佔式指針-對象的專屬所有權
*同一時刻智能有一個unique_ptr指向這個對象。當unique_ptr被釋放的時候,它所指向的對象也被銷燬。
*	1.常規初始化
*	2.
*(2)unique_ptr常用操作
*	2.1unique_ptr不支持的操作
*	2.2 移動語義
*	2.3release(),放棄對指針指向對象的控制權,返回裸指針,同時將智能指針置空。
*		返回的裸指針可以正常使用。
*	2.4reset()
*	不帶參數,釋放智能指針對象所佔的內存空間,並經智能指針置空
*	帶參數,釋放原來的內存空間,並且指向新對象
*
*	2.5 =nullptr釋放智能指針所指向的內存空間,並將智能指針置空
*
*	2.6指向一個數組
	2.7get() 返回智能指針中返回的裸指針
	
*	2.8解引用 *獲取智能指針的對象,直接進行操作
*	2.9swap()交換兩個智能指針所指向的對象
*	2.10智能指針名字作爲if判斷條件
*
*	2.11 unique_ptr轉換成shared_ptr類型,轉換後賦值
*	shared_ptr包含一個顯式的構造函數,
*	轉換的過程中會創建控制塊
*(3)
*
*	unique_ptr是沒有控制塊的
*
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章