c++本身不提供自动内存回收机制,所以每次我们有new一个对象或者数组,我们都是时时刻刻提醒自己要记得去delete new出来的对象,那样岂不是非常烦人?而且就算你记得在析构函数中delete new出来的对象,也同样会造成很多问题,比如一个class里面有个指针,初始化的时候new了一块内存,然后class 有个对象a,再通过class b=a复制一份a,这样其实两个对象分别有一个指针指向new的那块内存,当有一个对象生命周期结束的,析构函数释放了那块内存,然后另外一个对象生命周期结束再去释放的时候就会出错了。。。。。
故智能指针就是用来解决这些问题的,当然智能指针在多线程方面表现也优于裸指针,这个暂时还没深入了解。
常用的一些智能指针有std::auto_ptr, boost::scoped_ptr, boost::scoped_array, boost::shared_ptr, boost::shared_array, boost::weak_ptr,这里大概介绍一下每种智能指针的特性,具体用法其实跟一般的指针差不多,就是多了智能指针这一层封装而已。
STL里面是只有一种智能指针的,叫做auto_ptr,其实个人感觉被用到的机会也不多。。。auto_ptr能够保证一块new出来的对象只有一个归属,也就是说只有一个指针指向该内存,这个归属权是可以传递的,如a=b,那么原本属于b的归属权现在变成了a的了,并且能够保证不能够再用b去访问那块内存。总结:一个归属且归属权可传递
剩下的智能指针都是boost库下的了。。。这几天也会了解下c++11,看看有没有什么发现。
boost::scoped_ptr也保证只有一个归属权,但是该归属权是不可传递了,因为它实现了noncopyable()接口,保证不能被拷贝,故保证了归属权唯一且不可传递
注意_ptr是用来管理单个对象的,_array是用来管理动态生成的数组的
boost::scoped_array,保证只有一个归属权且归属权不可传递,当然它是用来管理动态数组的。
boost::shared_ptr,应该符合很多人对智能指针的概念,也就是一个对象有多个归属权,归属权可拷贝,这样相当于在复制的时候,多了一个指针指向该对象,那怎么做到智能释放对象呢?采用的是引用技术,当复制对象的时候,a=b,把b里面的指针指向内容的引用数+1,把a里面的指针指向内容的引用数-1,当引用数为0的时候,也就是释放内存的时候了。
boost::shared_array,同上,只不过是用来处理数组的。
boost::weak_ptr,既然有了上面这么多智能指针,为什么还需要weak_ptr呢?weak_ptr一般是和shared_ptr一起出来的,就是为了解决shared_ptr存在的问题,引用技术固然好,但是也存在循环引用的问题,可以把shared_ptr看成强引用,把weak_ptr看成弱引用,这样在形成循环引用的时候,我们需要把其中一个改成弱引用,就不会再有问题了,因为引用技术其实保存着两个值,一个是总的引用数,一个是真是的强引用数,只有当真实的强引用数为0的时候,才进行内存释放。
好了,偶去学c++11 去了
原文地址:http://blog.csdn.net/wangyuquanliuli/article/details/41517223