c++ 智能指针

智能指针

#include<iostream>
#include<memory>
using namespace std;

class TyTest{
private:
	int a;
	int b;
public:
	TyTest(int x, int y)
	{
		a = x;
		b = y;
	}

	void show()
	{
		cout << "a:" << a << endl;
		cout << "b:" << b << endl;
	}

	~TyTest()
	{
		cout << "我是析构函数\n";
	}

};
//1.先把智能指针用起来, 关于智能指针应该要学shared_ptr、unique_ptr、weak_ptr
void playex()
{

//1.1 shared_ptr的使用:
	              //实现共享式拥有(shared ownership)概念。多个智能指针可以指向相同对象.
	/*
	
	shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的
	引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,
	但是对象的读取需要加锁。
	*/
	
	/*

	**第一种方法

	*/
	cout << "第1种使用方法\n";
	//普通变量
	shared_ptr<int> m_int1(new int(20));
	cout << *m_int1 << endl;
	//对象
	shared_ptr<TyTest> m_Tytest1(new TyTest(10, 11));
	m_Tytest1->show();


	//使用get获取原始指针
	TyTest *ptr = m_Tytest1.get();
	ptr->show();

	/*

	*第二种方法

	*/

	//普通变量,使用make_shared
	cout << "第2种使用方法\n";
	shared_ptr<int> m_int2 = make_shared<int>(2);
	cout << *m_int2 << endl;

	//对象
	shared_ptr<TyTest> m_Tytest2 = make_shared<TyTest>(101, 102);
	m_Tytest2->show();

	//shared_ptr可以拷贝
	shared_ptr<int> m_copyint2(m_int2);
	cout << "我是复制的:" << *m_copyint2 << endl;

	cout << "m_int1的数量:" << m_int1.use_count() << endl;//1
	cout << "m_int2的数量:" << m_int2.use_count() << endl;//2

	shared_ptr<int> m_int3 = m_copyint2;//赋值
	cout << "m_int2的数量:" << m_int2.use_count() << endl;//3

//1.2 unique_ptr的使用:
	             //实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,
                 //保证同一时间内只有一个智能指针可以指向该对象
	unique_ptr<int> m_uniqueint(new int(521));
	cout << *m_uniqueint << endl;//521

	//使用get获取原始指针
	int *ptrx = m_uniqueint.get();
	cout << "m_uniqueint的原始指针:"<< *ptrx << endl;
	//unique_ptr<int> m_uniqueint1 = m_uniqueint; 不可以赋值
	//unique_ptr<int> m_uniqueint2(m_uniqueint); 不可拷贝
//1.3 weak_ptr的使用:
	               //weak_ptr是为了配合shared_ptr而引入的一种智能指针,因为它不具有普通指针的行为

	shared_ptr<TyTest> m_Ty1 = make_shared<TyTest>(11, 21);
	weak_ptr<TyTest> m_ty1weak(m_Ty1);
	//use_count(),观察应用计数
	cout << "m_Ty1的数量:" << m_ty1weak.use_count() << endl;
	//expired(),相当于use_count() == 0,但比它快
	if (!m_ty1weak.expired())
	{
	//lock()函数,将返回一个存储空指针的shared_ptr
		shared_ptr<TyTest> m_Ty2 = m_ty1weak.lock();
		cout << "m_Ty1的数量:" << m_ty1weak.use_count() << endl;
	}
	
}


void main()
{

	playex();
	system("pause");
}

结果:
在这里插入图片描述

//总结:智能指针原理就是以对象管理资源,可以看看我之前的文章,
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值