智能指针——shared_ptr

文章来源于C++Primer的读后笔记

众所周知,智能指针是模版,因此应在<>里面给出类型,则创建shared语句为:

shared_ptr<string> p1;
  • 默认初始化为空
  • 使用方式和普通指针一样(解引用、引用)

支持功能代码实例:

1.p

int main()
{
	shared_ptr<string> p;//默认初始化为空

	if(!p)
		cout << "[(p):当将p作为条件判断时候,若p指向其他对象,则返回true,若为空,返回false]" << endl;
	return 0;
}

2.make_shared(param)、*p

int main()
{
	shared_ptr<string> p = make_shared<string>("make_shared<T>(param)返回一个shared_ptr,指向动态分配的T类型内存,使用param初始化\n*p为对shared内存的解引用");
	
	cout << *p <<endl;
	return 0;
}

在这里插入图片描述

make_shared<T>(count,param)
make_shared<T>()
eg:
	make_shared<string>(10,"s");	//ssssssssss
	make_shared<int>();	//0

3.swap(p,q)、p.swap(q)

交换两个shared_ptr所指向的对象(不仅适用于shared_ptr)

int main()
{
	shared_ptr<string> p1 = make_shared<string>("I am p1");
	shared_ptr<string> p2 = make_shared<string>("I am p2");

	cout << "交换之前:" << endl;
	print(p1, p2);

	cout << "第1次交换之后:" << endl;
	swap(p1, p2);
	print(p1, p2);
	
	cout << "第2次交换之后:" << endl;
	p1.swap(p2);
	print(p1, p2);

	return 0;
}

在这里插入图片描述

4.p.use_count

返回p共享对象的智能指针数量

int main()
{
	shared_ptr<string> p1 = make_shared<string>("I am p1");
	cout << "p1:引用次数:" << p1.use_count() << endl;
	shared_ptr<string> p2(p1);
	cout << "p1:引用次数:" << p1.use_count() << endl;
	return 0;
}

在这里插入图片描述

注意:p2中同样记录引用次数的,并且于p1数量一致。引用次数为0时,自动释放内存。

5.shared_ptrp(q)

拷贝,下面代码主要验证是否增加拷贝次数

int main()
{
	shared_ptr<string> p1 = make_shared<string>("I am p1");
	cout << "p1:引用次数:" << p1.use_count() << endl;
	shared_ptr<string> p2 = shared_ptr<string>(p1);
	cout << "p1:引用次数:" << p1.use_count() << endl;
	shared_ptr<string> p3 = shared_ptr<string>(p1);
	cout << "p1:引用次数:" << p1.use_count() << endl;
	return 0;
}

在这里插入图片描述

6.自动销毁所管理的对象

use_count 为0时,调用析构函数完成对象的销毁(为了方便掩饰,自定义A类)

class A
{
	int a;
public:
	A()
	{
		a = 10;
	}
	~A()
	{
		cout << "~A:" << "调用了我" << endl;
	}
};

int main()
{
	shared_ptr<A> a = make_shared<A>();

	return 0;
}

在这里插入图片描述
从上述代码中也可以看到 对象a离开作用域自定释放
(此处理解不够,有错请大佬指出)

猜你喜欢

转载自blog.csdn.net/qq_43679333/article/details/107982903