智能指针

问题来源:new 出来的对象一般要手动delete,如果发生异常导致程序(函数)过早退出从而没有执行delete,造成内存泄露。

智能指针可以解决这个问题,它是将基本类型指针封装成类对象指针(这个类是个模板),并在析构函数里编写delete语句,删除指针指向的内存空间。

对于编译器来说,智能指针实际上是个栈对象,在栈对象生命周期结束的时候,会调用析构函数。

STL提供了四个类smart_ptr:auto_ptr(c++98),unique_ptr(c++11) ,shared_ptr(c++11),weak_ptr(c++11)

template
class auto_ptr
{
explicit auto_ptr(T * p=0);
….
};

1.智能指针类都有一个显示构造函数,必须显示调用

shared_ptr pd;
double * p_reg=new double;
pd=p_reg; // 错误 因为不支持隐式转换

shared_ptr pshared(p_reg) //正确

2.智能指针应当避免指向栈对象

string s(“This is a test”);
shared_ptr p(&s);//错误,因为p生命周期结束时,调用析构函数,将delete运算符作用于非堆区

3.c++11摒弃了auto_ptr

auto_ptr p(new string(“This is a test”));
auto_ptr p1=p;
两个指针指向了同一个对象,这样可能会删除一个对象两次,一次p,一次p1
为了避免这个问题有三种解决方案:

定义赋值运算符,将对象复制 (浪费空间,未采用)

建立所有权的概念:对于特定的对象,只有一个智能指针拥有,只有拥有所有权的智能指针才能删除对象(赋值操作转让所有权,auto_ptr,unique_ptr)

auto_ptr ps(new string(“Hello”));
auto_ptr pl=ps;
cout<<*ps<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值