总结
1. reset(),参数为空时,会释放shared_ptr所拥有的对象,释放后执行get()会返回false
2. reset(xx),参数不为空时会先释放原来拥有的对象,再获取新对象的所有权
3. get() 判断shared_ptr当前是否拥有对象
实验如下图
代码如下
#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; }



