开始学习
C++ 智能指针
由于 C++ 没有提供自动内存回收机制,因此每个 new
出来的对象在不需要时都要手动 delete
掉,否则就会造成内存泄漏(memory leak)。但由于种种原因,例如程序流程太复杂,或者程序员忘记 delete
,都会导致最终没有 delete
,影响程序运行甚至异常退出。因此,在现代 C++ 编程中,标准库定义了智能指针(Smart Pointer),这些智能指针用于帮助确保程序不会出现内存泄漏,并具有异常安全。
C++ 提供了四种智能指针,分别是 auto_ptr
、unique_ptr
、shared_ptr
和 weak_ptr
。
- 其中
auto_ptr
是 C++98 提供的解决方案,C+11 已将其摒弃,并提出了unique_ptr
作为auto_ptr
替代方案。 - 虽然
auto_ptr
已被摒弃,但在实际项目中仍可使用,但建议使用较新的unique_ptr
,因为unique_ptr
比auto_ptr
更加安全。 shared_ptr
和weak_ptr
则是 C+11 从准标准库 Boost 中引入的两种智能指针。- 此外,Boost 库还提出了
boost::scoped_ptr
、boost::scoped_array
、boost::intrusive_ptr
等智能指针,虽然尚未得到 C++ 标准采纳,但是在开发实践中可以使用。
对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放由它管理的堆内存。所有智能指针都重载了 operator->
操作符,直接返回对象的引用,用以操作对象。访问智能指针原来的方法则使用 .
操作符。
访问智能指针包含的裸指针则可以用 get()
函数。由于智能指针是一个对象,所以 if (my_smart_object)
永远为真,要判断智能指针的裸指针是否为空,应该使用如下方式判断。
if (my_smart_object.get())
智能指针包含了 reset()
方法,如果不传递参数(或者传递 NULL
),则智能指针会释放当前管理的内存。如果传递一个对象,则智能指针会释放当前对象,来管理新传入的对象。
智能指针在 std
命名空间中定义 ,下面我们将逐一介绍四种智能指针。