1.shared_ptr
unique_ptr也有于shared_ptr相同的用法:
p、*p、p->get()、swap(),详情参见shared_ptr
1.特性
- 某一时刻,只能有一个unique_ptr指向一个给定的对象
- 当unique_ptr被销毁,,它所指向的对象也被销毁
- 不能用make_shared,而是要将其绑定在一个new返回的指针上。
unique_ptr<int> p2(new int(42));
- 不支持普通的拷贝和赋值
错误示范:
int main()
{
unique_ptr<string> p1(new string("asdfg"));
unique_ptr<string> p2(p1);
unique_ptr<string> p3;
p3 = p2;
return 0;
}
2.reset()和release()
- reset();放弃对象并释放
- reset(q);指向q
- u.release();释放对象,返回指针,并将u滞空
代码演示:
int main()
{
//realease正确用法
unique_ptr<string> p1(new string("asdfg"));
unique_ptr<string> p2(p1.release());
cout << *p2 << endl;
//realease错误示范,p2不会释放内存,并丢失指针
unique_ptr<string> p3(new string("123456"));
p3.release();
//reset正确示范
p2.reset();
unique_ptr<string> p4(new string("123456"));
p2.reset(p4.release());//实现拷贝
return 0;
}
3.特殊的拷贝和赋值
即将销毁的unique_ptr可以使用普通的拷贝赋值
unique_ptr<string> fun1(string p)
{
return unique_ptr<string>(new string(p));
}
unique_ptr<string> fun2(string p)
{
unique_ptr<string> ret(new string(p));
return ret;
}
int main()
{
//realease正确用法
unique_ptr<string> p1(fun1("I Love You!"));
unique_ptr<string> p2(fun2("MeeTo!"));
cout << "你:" + *p1 << endl;
cout << "你的女神:" + *p2 << endl;
return 0;
}
4.向unique_ptr传递删除器
(没太理解,所以直接贴原书内容,日后补全)
2.weak_ptr
weak必须有一个shared来初始化
eg:
auto p1 = make_shared<int>(42);
weak_ptr<int> p2(p1);
auto p1 = make_shared<int>(42);
weak_ptr<int> p2(p1);
cout << p1.use_count() << endl;
输出一下p1的引用次数发现p1的引用次数依旧是1,得出结论:weak_ptr不会增加shared_ptr的引用次数
但是如果p1被释放了,我们再调用p2肯定会出现错误,所以我们那不能直接调用它。应该这样:
if(shared_ptr<int> a = p2.lock())
{
//。。。。。。。
}