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;
}
3.向unique_ptr传递删除器
(没太理解,所以直接贴原书内容,日后补全)