总结
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;
}