C++ 11 智能指针

来源:互联网 发布:php简单计算器 编辑:程序博客网 时间:2024/04/28 04:12

对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对象生命期即将结束时,智能指针通过析构函数释放有它管理的堆内存。

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不能用来管理堆内存数组; 

2、boost::scoped_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 中。(很少用到)


0 0