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

总结

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

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

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

实验如下图

c++ shared_ptr的reset(), get()_第1张图片

 代码如下

#include 
#include 
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 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;
}

你可能感兴趣的:(知识积累,shared_ptr,reset函数)