智能指针

来源:互联网 发布:mac launchpad 添加 编辑:程序博客网 时间:2024/05/17 01:57

刚看到c++中智能指针,总结下

首先说一下为什么会出现智能指针

void remodel(std::string & str){    std::string * ps = new std::string(str);    ...    str = ps;    return;}
以上面这段C Prime plus的代码为例,问题很简单,分配了堆上的空间而没有进行回收导致内存泄露。ps这个指针变量分配在栈上面,函数退出时存放指针的内存被释放,但是ps指针指向的堆空间内存却没有进行回收,ps不是类对象,在函数退出的时候无法调用类的析构函数,智能指针想要解决这个问题,即想在指针过期时,释放掉它所指向的类对象。


具体的使用方法不想赘述,希望记录下使用这些智能指针的注意事项和区别。

①所有智能指针类都是一个explicit构造函数,该构造函数将指针作为参数,因此不需要自动将指针转化为智能指针类型,如

shared_ptr<double> pd;double *p_reg = new double;pd = p_reg;shared_ptr<double> pshared = p_reg;
这两种赋值方式都是不允许的。


②auto_ptr,unique_ptr,shared_ptr区别

a.对于auto_ptr,unique_ptr,他们有所有权的概念,只有拥有对象的智能指针的构造函数会删除对象,赋值操作会转让所有权。

auto_ptr<string> p1(new string("heiworld");auto_ptr<string> p2 ;p2 = p1  //p1的所有权转给p2cout << *p1   //p1已经丧失所有权,访问出错
auto_ptr会在程序的运行过程中出错,但假如上面的列子中用的是unique_ptr,那在编译的过程中就会出错,所以unique_ptr更安全。

如果赋值的过程中创建的是临时值,那无论是auto_ptr还是unique_ptr,都是允许的。比如

unique_ptr<string> p1 ;p1 = unique_ptr<string> new string("heiworld"); 


而shared_ptr会跟踪引用特定对象的智能指针数,赋值时,计数加1,指针过期时,指针减1,当最后一个指针过期时,才调用delete。所以下面的列子还是能成功运行的

shared_ptr<string> p1(new string("heiworld");shared_ptr<string> p2 ;p2 = p1;  cout << *p1; 

所以加入程序要使用多个指向同一个对象的指针应该选择shared_ptr,比如很多STL算法都支持复制和赋值操作,这些操作可用于shared_ptr,但不能用于unuque_ptr和auto_ptr。


b.auto_ptr使用delete而不是delete [],因此只能与new一起使用,而不能用new [] ,但是unique_ptr有使用new [] 和delete []的版本






0 0
原创粉丝点击