5-4 weak_ptr概述、weak_ptr常用操作、尺寸

004weak_ptr概述與常見操作

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

using namespace std;


int main(void)
{
	//weak_ptr一般是使用shared_ptr來創建愛女
	auto p1 = make_shared < int>(100);
	weak_ptr<int>p2Weak(p1);//p2Weak是弱引用,強引用計數不會改變,一個強引用,一個弱引用指向100
	//只有強引用決定對象的生存期。若引用對對象生存期沒有影響
	weak_ptr<int>p3Weak = p2Weak;//使用一個弱引用給另一個弱引用賦值。

	//lock()的功能:檢查weak_ptr所指向的對象是否存在,如果存在,就返回一個指向該對象的shared_ptr指針,
	//如果不存在,返回的指針指向爲空
	//p1.reset();//釋放該對象
	auto p4shared_ptr = p2Weak.lock();//p4shared_ptr是一個返回的shred_ptr,強引用計數+1
	

	//常見函數用法
	int count = p2Weak.use_count();
	cout << count << endl;	//2

	//expired--過期判斷
	//指向100的兩個強引用都設置爲過期
	p1.reset();
	p4shared_ptr.reset();
	if (p2Weak.expired())//返回值爲true
	{
		cout << "對象已經過期" << endl;
	}

	//(4)尺寸問題
	weak_ptr<int>p5_weak;
	int*p6 = nullptr;
	int length1 = sizeof(p5_weak);	//8
	int length2 = sizeof(p6);	//4
	cout << "length1=" << length1 << endl;
	cout << "length2=" << length2 << endl;

	system("pause");
	return 0;
}

/*
*(1)weak_ptr概述
*用於輔助shared_ptr指針進行工作
*強指針strong--shared_ptr
*弱指針weak--weak_ptr
*weak_ptr也是一個類模板,這個指針指向一個有shared_ptr管理的對象,但是weak_ptr不控制生存週期。
*換句話說,將weak_ptr綁定到shared_ptr上不會改變shared_ptr對象的引用計數。
*當shared_ptr需要釋放所指定對象時候,不管是否有weak_ptr是否指向該對象。
*
*weak_ptr爲什麼需要引入???
*weak--能力弱,也叫弱引用,弱共享
*作用:理解爲監視shared_ptr的聲明週期,是對shared_ptr的一種擴充。
*weak_ptr不是一種獨立的智能指針,不能用來操作所指向的資源,所以它看起來是shared_ptr的一個助手
*weak_ptr用於監視它所指向的對象是否存在。
*
*
*(2)weak_ptr的創建、
*使用shared_ptr初始化weak_ptr
*
*(3)weak_ptr用法
*	可以使用weak_ptr爲shared_ptr賦值
*	
*	1.use_count() 獲取該弱指針共享對象的其他shared_ptr的數量,或者說獲取當前觀測支援的強引用數量。
*	2.expired()是否過期的意思,弱引用指針的use_count()==0,返回true,換句話說,這個函數用於判斷所觀測的資源是否已經被釋放。
*(4)尺寸問題
*	weak_ptr<int>pw
*	weak_+ptr和shared_ptr尺寸一樣大,是裸指針的兩倍
*	一個智能指針包含兩個指針,(1)第一個指針指向智能指針的對象
*		(2)第二個指針指向“智能指針控制塊”的數據結構,控制塊裏面有“強引用計數”,“弱引用計數”“其他數據等如內存分配器,自定義刪除器等”
*	詳細見圖
*		
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章