对智能指针的一些理解

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 去了

时间: 2024-10-06 00:39:56

对智能指针的一些理解的相关文章

自己理解的智能指针

看安卓内核,第一章就碰到智能指针了. 看了网上的一些文章,自己实践了一下. 自己的体会: 普通指针直接为某个具体类型分配空间,对该空间的管理直接由指针来操作.T* p=new  T(t); 智能指针相当于对该空间进行封装.智能指针实际是一个类,shared_ptr<T> sp(new T(t)); 类里面包含一个成员,uptr(T* t,size_t use). uptr除了保存着普通指针指向的具体空间外,uptr还有个成员,引用计数. 因此,普通指针p对其指向空间的操作,在智能指针中表现为s

智能指针的理解

1. shared_ptr是要程序管理的对象,这个对象管理了它引用的另一个对象 2. shared_ptr销毁的时候,把它引用的对象的引用数减一,这个是强引用 3. weak_ptr可以认为是普通指针,它不管理它引用的对象的内存 左边的小方块是智能指针对象,右边P对象拥有一个引用C的智能指针,C要能P销毁后才能销毁

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

C++智能指针剖析(下)boost::shared_ptr&amp;其他

1. boost::shared_ptr 前面我已经讲解了两个比较简单的智能指针,它们都有各自的优缺点.由于 boost::scoped_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不了了,如此我们再引入一个智能指针,专门用于处理复制,参数传递的情况,这便是如下的boost::shared_ptr. boost::shared_ptr 属于 boost 库,定义在 namespace boost 中,包含头文件#include<boost/smart_ptr.hpp> 便可以使

C++中智能指针的设计和使用

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235      智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是 使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.每次创建类的新对象时,初始化指针并将引用计数置为

【C++深入浅出】智能指针之auto_ptr学习

起:  C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template<class _Ty> class auto_ptr { // wrap an object pointer to ensure destruction public: //定义_Myt类型,作用域局限于类中,便于书写和理解 typedef auto_ptr<_Ty> _Myt; typ

智能指针(模拟实现AutoPtr、ScopedPtr、SharedPtr)

模拟实现AutoPtr.ScopedPtr.SharedPtr 智能指针实际上就是能够智能化的管理动态开辟空间的内存释放问题,C++中引入智能指针,很大一方面是当我们在动态开辟空间时,由于一些疏忽,或者说是对于一些代码,执行的顺序不是我们预期能够想到的,导致一些内存泄露的问题,使得程序健壮性不够,可维护性降低. 智能指针的基本特点: 1)智能指针管理的是一块内存的释放. 2)智能指针是一个类,有类似指针的功能. 下面主要是AutoPtr的理解: 当我们了解上面的知识后,模拟实现智能指针AutoP

c++智能指针以及循环引用问题(转)

解决循环引用: 在知道存在循环引用的条件下,使用boost::weak_ptr,即弱引用来代替循环引用中的某个强引用,从而打破循环引用的环. 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露.如此c++引入 智能指针 . c++ 智能指针主要包括:unique_ptr,shared_ptr, weak_ptr, 这三种,其中auto

C++11智能指针

C成也指针,败也指针.确实,指针给程序员提供了很多便利和灵活性,但是不当的指针使用也会造成很多问题. Java和C#避免了指针(虽然C#中也能使用指针,但是估计很少有人这样做),其垃圾回收机制,给程序员减轻很多管理内存的负担. 为了带来指针更好的使用体验,C++中引入了智能指针的概念,其实质就是将指针的一些操作封装成类,程序员通过使用熟悉的指针运算符(-> 和 *)访问封装指针,该指针类通过运算符重载返回封装的原始指针. C++ 智能指针思路类似于C#等语言中创建对象的过程:创建对象后让系统负责