今天试用了下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 了。