1 - 智能指针概述

本文将对三种智能指针shared_ptrunique_ptrweak_ptr做一些简要介绍。

为什么要有智能指针

内存管理是C++中常见的错误和bug来源,例如直接用new和delete容易导致内存泄漏。而智能指针可帮助管理动态分配的内存,这是避免内存泄漏建议采用的技术。

智能指针可用于管理在函数作用域/类的数据成员内动态分配的资源,也可以通过函数实参来传递动态分配的资源的所有权。

查看以下代码,它看起来是安全的,实则不然:

void couldBeLeaky()
{
    Simple* pSimple = new Simple();
    pSimple->doSth();
    delete pSimple;
}

如果doSth()方法抛出了一个异常,将永远不会调用 delete,导致内存泄漏。

因此使用智能指针是十分重要的。

智能指针的种类

对于普通的裸指针,可以单独占用一块内存,也能多个指针共享一块内存,太灵活了以致于可能会发生内存问题。

智能指针主要有以下三种:

  • 独享型智能指针unique_ptr:同一块堆内存只能被一个unique_ptr拥有
  • 共享型智能指针shared_ptr:同一块堆内存可以被多个shared_ptr拥有
  • 弱引用智能指针weak_ptr:也是一种共享型智能指针,可以视为对shared_ptr的一种补充

注意事项

  • 智能指针和裸指针不能混用
  • 能使用智能指针就尽量使用智能指针,且能用unique_ptr就用它。必须用C语言指针的情况包括:
    • 网络传输函数:例如windows下的send,recv
    • C语言的文件操作部分:传统C语言的文件操作
    • 传统C风格数组:智能指针对传统C风格数组的支持不是很好

参考资料

  • 飘零的落花 - 现代C++详解
  • C++20高级编程