智能指针之我见

Huan Lee Lv5

https://www.cyhone.com/articles/right-way-to-use-cpp-smart-pointer/

《Effective modern C++: 42 specific ways to improve your use of C++11 and C++14》Item 18: Use std::unique_ptr for exclusive-ownership resource management.

本文整理一下个人对智能指针用法的总结

为什么使用智能指针?

  • unique_ptr保证指针的归属权, 并且能够在指针生命周期结束时自动销毁对象, 释放空间
  • shared_ptr会进行对象的引用统计, 当引用数为0时, 对象会被销毁.
  • 使用智能指针后, 几乎不再需要delete, 无论是生命周期正常结束, 指针重新赋值甚至发生异常, 都不需要手动释放空间, 可以极大程度避免内存泄漏.

选择哪个智能指针?

  • 无论是从安全性还是性能上来看, 都应该优先考虑unique_ptr而不是shared_ptr;

    • 如果对象全局唯一, 考虑单例模式
  • 只有对象确实同时被多个对象拥有, 再考虑使用shared_ptr

unique_ptr

什么时候使用

  • 首先是在类中用于管理专属的数据. 如字符串等data对象
  • 其次是声明生命周期仅限于函数内部的局部指针变量, 使用unique_ptr就不用手动delete, 在函数有多条return时尤其方便

使用细节

  • 形参是否使用智能指针, 取决于函数是否会发生归属权的变化.

    • 对于需要获取指针进行赋值, 拷贝, 比较等操作, 而不改变指针归属的函数, 形参采用raw pointer

    • 对于会改变指针归属的函数, 形参采用智能指针的引用.

  • 返回值是否使用智能指针, 取决于是否允许调用者改变指针归属权

    • 若不允许改变归属权的接口, 返回值为raw pointer

    • 对于允许指针归属权改变的接口ref_api, 返回值为智能指针的引用.

    • 对于要求指针归属权改变的接口ref_api, 返回值为智能指针.

1
2
3
4
5
6
// 若调用者要改变指针归属权
std::unique_ptr<Obj> up(src.ref_api(args…).release();
src.ref_api(args...).move(up);

// 若调用者只是需要获取指针进行赋值, 拷贝, 比较等操作, 而不改变指针归属
Obj *ptr = src.ref_api(args..).get();
  • Title: 智能指针之我见
  • Author: Huan Lee
  • Created at : 2023-09-01 17:06:40
  • Updated at : 2023-09-01 19:43:54
  • Link: https://www.mirthfullee.com/2023/09/01/notion-None-e640217e/
  • License: This work is licensed under CC BY-NC-SA 4.0.