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_sharedmake_unique类似,且性能有优化。

2. 智能指针的其它特性

  • 支持数组
unique_ptr<T[]>      // C++11
shared_ptr<T[]>      // C++17

可以使用operator[]访问其中的元素

  • 自定义删除器
  • =, <, >等比较
  • weak_ptr 父结点中指向子结点的指针可以用shared_ptr
    子结点中指向父结点的指针不建议使用shared_ptr可以使用unique_ptr

3. 智能指针的比较

  1. unique_ptr
  2. 唯一拥有权,使用简单
  3. 可转换为shared_ptr
  4. 对象有明确的使用权时使用

  5. shared_ptr

  6. 所有权关系不明晰

  7. [?]蔓延问题
  8. 修改引用计数为原子操作,影响性能
  9. 有可能访问数据失效但又不报错
  10. 适合共享不变的数据

4. 智能指针的使用建议

  1. 若指针具有拥有权(即需要使用new/delete),应使用unique_ptrshared_ptr
  2. 尽量使用unique_ptr
  3. 使用智能指针进行拷贝构造和拷贝赋值时,会影响对应的生命周期
  4. 传参使用普通指针或引用,除非希望所有权一起传递

results matching ""

    No results matching ""