unique_ptr也有于shared_ptr相同的用法:
p、*p、p->get()、swap(),详情参见shared_ptr
unique_ptr p2(new int(42));
错误示范:
int main()
{
unique_ptr p1(new string("asdfg"));
unique_ptr p2(p1);
unique_ptr p3;
p3 = p2;
return 0;
}
代码演示:
int main()
{
//realease正确用法
unique_ptr p1(new string("asdfg"));
unique_ptr p2(p1.release());
cout << *p2 << endl;
//realease错误示范,p2不会释放内存,并丢失指针
unique_ptr p3(new string("123456"));
p3.release();
//reset正确示范
p2.reset();
unique_ptr p4(new string("123456"));
p2.reset(p4.release());//实现拷贝
return 0;
}
即将销毁的unique_ptr可以使用普通的拷贝赋值
unique_ptr fun1(string p)
{
return unique_ptr(new string(p));
}
unique_ptr fun2(string p)
{
unique_ptr ret(new string(p));
return ret;
}
int main()
{
//realease正确用法
unique_ptr p1(fun1("I Love You!"));
unique_ptr p2(fun2("MeeTo!"));
cout << "你:" + *p1 << endl;
cout << "你的女神:" + *p2 << endl;
return 0;
}
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())
{
//。。。。。。。
}