std::auto_ptr 不能赋值 简析

今天试用了下std::auto_ptr, 第一次使用就出错了,尴尬啊,先还原现场:

 

类内声明:

Std::auto_ptr<Widget> m_pWgt;

 

类构造函数内赋值:

m_pWgt = new Widget;

 

大概就是这样,编译很顺利通过,一运行,蹦出个run-time error, 错误显示m_pWgt里无对象,于是trace到auto_ptr的赋值构造函数,查看了auto_ptr源码发现问题所在,现将部分源码列出如下:

 

 

 

从 auto_ptr 的源码可以得出语句 m_pWgt = new Widget; 的真实行为,首先使用 new 出来的指针初始化了一个 auto_ptr_ref 对象,然后将这个 auto_ptr_ref 对象赋值给 auto_ptr 对象,但是从赋值构造函数可以看出 auto_ptr_ref 内的指针指向的是 auto_ptr 内指针的地址,也就是个二级指针,试想一下,拿一个 new 出来的一级指针去初始化一个二级指针,然后将这个“二级指针”(实际是一级指针)里的解引用又赋值一个一级指针,效果如下图所示:

 

 

本来 new 出来的指针 ptr 指向 Widget 对象,然而经过 auto_ptr_ref 转换之后, auto_ptr 中的指针变成了 p , p 作为一个指针指向的位置是非法的,所以也就是为什么会 run_time error 了。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值