智能指针使用实例(带代码演示)

1.make_shared写法(1) 和 new对象后获取指针再初始化(2)

struct lifePeriod
{
	lifePeriod():a(1)
	{
		cout << "无参构造!" << endl;
	}
	virtual ~lifePeriod()
	{
		cout << "析构!" << endl;
	}
	lifePeriod(const lifePeriod& d)
	{
		cout << "有参构造!" << endl;
	}
	int a;
};
int main()
{
	{
		cout << "----------------开始-------------------" << endl;
		//unique_ptr 不允许被复制,但是可以通过函数返回给其他的 unique_ptr,还可以通过 move() 转移给其他的 unique_ptr。
		//还是一个 unique_ptr 独占一个地址
		lifePeriod lifeT;
		unique_ptr<lifePeriod> p1 = make_unique<lifePeriod>(lifeT);
		unique_ptr<lifePeriod> p11(move(p1));
		cout << "................结束..................." << endl;
	}
	cout << "***********************开始************************" << endl;
	{
		shared_ptr<lifePeriod> p2 = make_shared<lifePeriod>(lifePeriod());
		cout << p2.use_count() << endl;
	}
	cout << "***********************结束************************" << endl;
	{
		unique_ptr<lifePeriod> p3(new lifePeriod);
	}
	cout << "++++++++++++++++++++++++开始++++++++++++++++++++++++++++" << endl;
	{
		unique_ptr<lifePeriod> p4 = make_unique<lifePeriod>();
	}
	cout << "++++++++++++++++++++++++结束++++++++++++++++++++++++++++" << endl;
	{
		shared_ptr<lifePeriod> p5 = make_shared<lifePeriod>();
		cout << p5.use_count() << endl;
		shared_ptr<lifePeriod> p6(p5);
		cout << p5.use_count() << endl;
		p5.reset();
		cout << p5.use_count() << endl;
		cout << p6.use_count() << endl;
		cout << "##########################使用像指针,实际是类##############################" << endl;
		cout << p6->a << endl;
		unique_ptr<int> p(new int(1));
		cout << "管理的变量名称为:" << typeid(*p).name() << "   值:" << *p << endl;
		cout << "获取原始指针:" <<  *(p.get()) << endl;
	}
	cout << "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$weak_ptr$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" << endl;
	{
		//weak_ptr 只是监测资源,并不管理资源。
		shared_ptr<int> sp(new int);

		weak_ptr<int> wp1;
		weak_ptr<int> wp2(wp1);
		weak_ptr<int> wp3(sp);
		weak_ptr<int> wp4;
		wp4 = sp;
		weak_ptr<int> wp5;
		wp5 = wp3;

		cout << "use_count: " << endl;
		cout << "wp1: " << wp1.use_count() << endl;
		cout << "wp2: " << wp2.use_count() << endl;
		cout << "wp3: " << wp3.use_count() << endl;
		cout << "wp4: " << wp4.use_count() << endl;
		cout << "wp5: " << wp5.use_count() << endl;
		//weak_ptr 类提供的 expired() 方法来判断观测的资源是否已经被释放
		cout << "1. weak " << (wp5.expired() ? "is" : "is not") << " expired" << endl;
		//weak_ptr 类提供的 reset() 方法来情况对象,使其不监测任何资源
		wp5.reset();
		cout << "2. weak " << (wp5.expired() ? "is" : "is not") << " expired" << endl;
		cout << "wp4: " << wp4.use_count() << endl;
		cout << "wp5: " << wp5.use_count() << endl;
		//weak_ptr 类提供的 lock() 方法来获取管理所监测资源的 shared_ptr 对象
		shared_ptr<int> sp1;
		sp1 = wp4.lock();
		cout << "sp1: " << sp1.use_count() << endl;
		cout << "wp4: " << wp4.use_count() << endl;
	}
}

2.结果

----------------开始-------------------
无参构造!
有参构造!
................结束...................
析构!
析构!
***********************开始************************
无参构造!
有参构造!
析构!
1
析构!
***********************结束************************
无参构造!
析构!
++++++++++++++++++++++++开始++++++++++++++++++++++++++++
无参构造!
析构!
++++++++++++++++++++++++结束++++++++++++++++++++++++++++
无参构造!
1
2
0
1
##########################使用像指针,实际是类##############################
1
管理的变量名称为:int   值:1
获取原始指针:1
析构!
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$weak_ptr$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
use_count:
wp1: 0
wp2: 0
wp3: 1
wp4: 1
wp5: 1
1. weak is not expired
2. weak is expired
wp4: 1
wp5: 0
sp1: 2
wp4: 2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值