智能指针

刚看到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的所有权转给p2
cout << *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 []的版本






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值