C++中的智能指针

在c++合适的使用智能指针能很好的解决内存泄露,和因为调用已经释放的指针而产生的内存访问异常而程序崩溃的问题。

1.标准c++程序库STL中提供了auto_ptr这个智能指针,基本上很少会有情况下会用到这个智能指针。auto_ptr将会转让所有权,转让所有权后本身将不再指向任何内存空间

  auto_ptr<T> pt( new T );

2.boost c++库中的scoped_ptr智能指针,该智能指针不能转让所有权

  scoped_ptr<T> pt(new T);

  可以通过pt.get()来测试智能指针所指向的空间是否为空。但一般推荐使用pt.unspecified_bool_type()来检测

  scoped_ptr用的比较多的地方应该是当在一个类里声明使用另一个对象,而此对象只会在这个类内部使用,例如官方教程上的pimpl用法

  scoped_array是scoped_ptr对应的数组智能指针,用法和scoped_ptr一样,在需要申请动态数组时候使用。

3.shared_ptr

  当被管理的类需要被多个对象所共享,或者说某一个对象可能随时会付给新的对象所有权,而不能取消以前的授权时,我们可以使用shared_ptr智能指针,

shared_ptr也是存在于boost c++库。

  shared_ptr 可以从一个裸指针、另一个shared_ptr、一个std::auto_ptr、或者一个boost::weak_ptr构造。还可以传递第二个参数给shared_ptr的构造函数。

boost c++中提供了一种让对象从this获得shared_ptr的方法,Boost.Smart_ptr 为这个任务提供了一个助手类,称为 enable_shared_from_this. 只要简单地让你的类公有地派生自enable_shared_from_this,然后在需要访问管理thisshared_ptr时,使用函数 shared_from_this 就行了。

#include "boost/shared_ptr.hpp"
#include "boost/enable_shared_from_this.hpp"

class A;

void do_stuff(boost::shared_ptr<A> p) {
...
}

class A : public boost::enable_shared_from_this<A> {
public:
void call_do_stuff() {
do_stuff(shared_from_this());
}
};

int main() {
boost::shared_ptr<A> p(new A());
p->call_do_stuff();
}

 shared_array 是shared_ptr对应的数组智能指针,用法和shared_ptr一样。

4.intrusive_ptr,该智能指针在boost c++库中,用于对象本身已经有引用计数的情况,用法基本同shared_ptr.

5.weak_ptr 智能指针是shared_ptr的观察员,可以从一个weak_ptr生成一个shared_ptr,但weak_ptr本身不能访问所观察的资源,只能观察shared_ptr的基本信息,比如use_count,

  另一个需要用到weak_ptr的地方为在标准库容器中使用了shared_ptr,我们在对shared_ptr进行操作时要防止shared_ptr本身的指向内存被修改,同时要打破递归的依赖关系。

posted @ 2012-03-11 20:47  曙光中睡懒觉  阅读(587)  评论(0编辑  收藏  举报