对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。
1、std::auto_ptr :
std::auto_ptr 属于 STL,在 namespace std 中。std::auto_ptr 能够方便的管理单个堆内存对象。
std::auto_ptr 的 release() 函数只是让出内存所有权,而不是释放内存,所以可能会导致内存泄漏。
总结:std::auto_ptr 可用来管理单个对象的对内存,但是,请注意如下几点:
(1) 尽量不要使用“operator=”。如果使用了,请不要再使用先前对象。
(2) 记住 release() 函数不会释放对象,仅仅归还所有权。
(3) std::auto_ptr 最好不要当成参数传递。
(4) 由于 std::auto_ptr 的“operator=”问题,有其管理的对象不能放入 std::vector 等容器中。
(5) auto_ptr不能用来管理堆内存数组;
boost::scoped_ptr 属于 boost 库,定义在 namespace boost 中。boost::scoped_ptr 跟 std::auto_ptr 一样,可以方便的管理单个堆内存对象,特别的是,boost::scoped_ptr 独享所有权,避免了 std::auto_ptr 的几个问题(release()导致内存泄漏和“=”导致内存管理的所有权易主)。
注意:
(1)、boost ::scoped_ptr不支持release()函数;
(2)、boost::scopted_ptr不支持“=”;以为boost::scoped_ptr不支持“=”,所以不能实现boost::scoped_ptr智能指针的复制;
(3)、因为boost::scoped_ptr不支持复制所以boost::scoped_ptr智能指针不能作为函数的参数;
3、boost::shared_ptr
boost::shared_ptr 属于 boost 库,定义在 namespace boost 中。boost::shared_ptr 是专门用于共享所有权的,由于要共享所有权,其在内部使用了引用计数。boost::shared_ptr 也是用于管理单个堆内存对象的。boost::shared_ptr 提供了一个函数 use_count() ,此函数返回 boost::shared_ptr 内部的引用计数。
4、boost::scoped_array
boost::scoped_array 属于 boost 库,定义在 namespace boost 中。 boost::scoped_array 便是用于管理动态数组的。跟 boost::scoped_ptr 一样,也是独享所有权的。
boost::scoped_array 的使用跟 boost::scoped_ptr 差不多,不支持复制,并且初始化的时候需要使用动态数组。另外,boost::scoped_array 没有重载“operator*”,其实这并无大碍,一般情况下,我们使用 get() 函数更明确些。
5、boost::shared_array
boost::shared_array 属于 boost 库,定义在 namespace boost 中。由于 boost::scoped_array 独享所有权,显然在很多情况下(参数传递、对象赋值等)不满足需求,由此我们引入 boost::shared_array。跟 boost::shared_ptr 一样,内部使用了引用计数。
6、boost::weak_ptr
boost::weak_ptr 属于 boost 库,定义在 namespace boost 中。boost::weak_ptr 是专门为 boost::shared_ptr 而准备的。有时候,我们只关心能否使用对象,并不关心内部的引用计数。boost::weak_ptr 是 boost::shared_ptr 的观察者(Observer)对象,观察者意味着 boost::weak_ptr 只对 boost::shared_ptr 进行引用,而不改变其引用计数,当被观察的 boost::shared_ptr 失效后,相应的 boost::weak_ptr 也相应失效。
7、boost::intrusive_ptr
boost::intrusive_ptr属于 boost 库,定义在 namespace boost 中。(很少用到)