关于智能指针类型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!

相关文章
相关标签/搜索