c++ shared_ptr的reset(), get()

本文详细介绍了智能指针`shared_ptr`的`reset()`方法在不同参数下的行为,包括释放对象和转移所有权。通过实例代码展示了`reset()`如何影响对象的生命周期,以及`get()`方法用于检查`shared_ptr`是否拥有对象。实验结果揭示了对象在失去`shared_ptr`管理后的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结

1. reset(),参数为空时,会释放shared_ptr所拥有的对象,释放后执行get()会返回false

2. reset(xx),参数不为空时会先释放原来拥有的对象,再获取新对象的所有权

3. get() 判断shared_ptr当前是否拥有对象

实验如下图

 代码如下

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

class CTest 
{
public:
	CTest(int a);
	~CTest();
	void print() { cout << "value=" << val << endl; }
	void set(int a);
private:
	int val;
};

void CTest::set(int a)
{
	val = a;
}

CTest::CTest(int a) : val(a) {
	cout << "start val=" << val << endl;
}

CTest::~CTest() {
	cout << "end val=" << val << endl;
}

int main() 
{
	shared_ptr<CTest> sp;  // empty

	CTest* p1 = new CTest(10);
	sp.reset(p1);	// 从p1获取所有权
	p1->set(3);
	sp->print();

	cout << "============ 1 =============" << endl;
	CTest* p2 = new CTest(20);
	sp.reset(p2);	// 先从p1放弃所有权(造成p1回收),再从p2获取所有权
	p1->print();	// 已被回收,打印出随机值
	sp->print();

	cout << "============ 2 =============" << endl;
	sp.reset();		// 放弃p2的所有权(造成p2回收)
	p2->print();	// 已被回收,打印出随机值
	//sp->print();  // 会崩溃
	
	cout << "============ 3 =============" << endl;
	// 未获取任何对象的所有权
	if (!sp.get()) 
	{
		cout << "empty" << endl;
	}

	getchar();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值