C++ 智能指针

由于 C++ 没有提供自动内存回收机制,因此每个 new 出来的对象在不需要时都要手动 delete 掉,否则就会造成内存泄漏(memory leak)。但由于种种原因,例如程序流程太复杂,或者程序员忘记 delete,都会导致最终没有 delete,影响程序运行甚至异常退出。因此,在现代 C++ 编程中,标准库定义了智能指针(Smart Pointer),这些智能指针用于帮助确保程序不会出现内存泄漏,并具有异常安全。

C++ 提供了四种智能指针,分别是 auto_ptrunique_ptrshared_ptrweak_ptr

  • 其中 auto_ptr 是 C++98 提供的解决方案,C+11 已将其摒弃,并提出了 unique_ptr 作为 auto_ptr 替代方案。
  • 虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用较新的 unique_ptr,因为 unique_ptrauto_ptr 更加安全。
  • shared_ptrweak_ptr 则是 C+11 从准标准库 Boost 中引入的两种智能指针。
  • 此外,Boost 库还提出了 boost::scoped_ptrboost::scoped_arrayboost::intrusive_ptr 等智能指针,虽然尚未得到 C++ 标准采纳,但是在开发实践中可以使用。

对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放由它管理的堆内存。所有智能指针都重载了 operator-> 操作符,直接返回对象的引用,用以操作对象。访问智能指针原来的方法则使用 . 操作符。

访问智能指针包含的裸指针则可以用 get() 函数。由于智能指针是一个对象,所以 if (my_smart_object) 永远为真,要判断智能指针的裸指针是否为空,应该使用如下方式判断。

if (my_smart_object.get())

智能指针包含了 reset() 方法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。

智能指针在 std 命名空间中定义 ,下面我们将逐一介绍四种智能指针。

Leave a Reply