1. 智能指针的创建
// 方法一:
auto ptr = std::make_unique<int>(5);
// 方法二:
auto ptr = std::unique_ptr<Point>(new Point{1,2});
例子一使用make_unique
函数,省去了new和类名重复。
例子二的Point无构造函数,使用聚合初始化,make_unique
方法不适用。make_shared
与make_unique
类似,且性能有优化。
2. 智能指针的其它特性
- 支持数组
unique_ptr<T[]> // C++11
shared_ptr<T[]> // C++17
可以使用operator[]访问其中的元素
- 自定义删除器
- =, <, >等比较
weak_ptr
父结点中指向子结点的指针可以用shared_ptr
子结点中指向父结点的指针不建议使用shared_ptr
可以使用unique_ptr
3. 智能指针的比较
unique_ptr
- 唯一拥有权,使用简单
- 可转换为
shared_ptr
对象有明确的使用权时使用
shared_ptr
所有权关系不明晰
- [?]蔓延问题
- 修改引用计数为原子操作,影响性能
- 有可能访问数据失效但又不报错
- 适合共享不变的数据
4. 智能指针的使用建议
- 若指针具有拥有权(即需要使用new/delete),应使用
unique_ptr
或shared_ptr
- 尽量使用
unique_ptr
- 使用智能指针进行拷贝构造和拷贝赋值时,会影响对应的生命周期
- 传参使用普通指针或引用,除非希望所有权一起传递