關於智能指針類型shared_ptr的計數問題

1、關鍵函數

每一個shared_ptr所指向的對象都有一個引用計數,它記錄了有多少個shared_ptr指向本身spa

shared_ptr的析構函數:遞減它所指向的對象的引用計數,若是引用計數變爲0,就會銷燬對象並釋放相應的內存指針

引用計數的變化:決定權在shared_ptr,而與對象自己無關對象

 

2、引用計數初步blog

	shared_ptr<int> sp;						//空智能指針 
	shared_ptr<int> sp2 = make_shared<int>(3);
	shared_ptr<int> sp3(sp2);
	cout << sp.use_count() << endl;			//輸出0
	cout << sp2.use_count() << endl;		//輸出2

注:sp.use_count()函數返回sp所指對象的引用計數內存

 

3、引用計數增長的狀況作用域

拷貝一個shared_ptr,其所指對象的引用計數會遞增,如:it

  • 用一個shared_ptr初始化另外一個shared_ptr
  • 用一個shared_ptr給另外一個shared_ptr賦值
  • 將shared_ptr做爲參數傳遞給一個函數
  • shared_ptr做爲函數的返回值

 

4、引用計數減小的狀況class

  • 給shared_ptr賦予一個新值
  • shared_ptr被銷燬(如離開做用域

 

5、迷途返航引用

1. 局部的shared_ptr離開其做用域,它所指對象的引用計數會遞減(-1)

假設:沒有全局的shared_ptr,那麼正確的結果應該是該shared_ptr所指的對象被銷燬

我以前錯誤的想法:多個局部shared_ptr共同指向同一個對象,那麼該對象的引用計數就>1,該函數結束時對象的引用計數減1(但仍>0),那麼該對象不該該被銷燬。

糾正想法:既然是多個局部shared_ptr指向該對象,那麼函數結束時對象的引用計數就不該該只減1啊!!

shared_ptr<int> init()
{
	shared_ptr<int> sp2 = make_shared<int>(3);
	shared_ptr<int> sp3(sp2);
	cout << sp2.use_count() << endl;		//輸出2 
	return sp2;								//返回sp2,故引用計數遞增,變爲3 
}											//sp2和sp3離開做用域,引用計數減2,變爲1 

int main()
{
	auto p = init();						//此處賦值的拷貝與return處的拷貝是一致的 
	cout << p.use_count() << endl;			//輸出1 
	return 0;
}

由代碼證明,函數結束時,引用計數減2,而非減1!

相關文章
相關標籤/搜索