先看一下auto_ptr的拷贝构造函数(C++11前还没有移动语义)
1 | auto_ptr(auto_ptr&); |
与一般的拷贝构造函数不同的是,std::auto_ptr为了获取对象的所有权,会修改参数(release())
一个简单的问题如下
1 | std::auto_ptr<int> pa(new int(100)); |
由于对象的所有权由pb所有,pa.release后,*pa实际上是对nullptr解引用,直接Segmentation fault了。
当然,尽管这是个低级错误,但是像下面的使用也会有同样的问题
1 | void f(std::auto_ptr<int> ptr); |
那么,为什么std::auto_ptr不仅仅弃用拷贝构造与赋值运算符呢?
首先,boost::scoped_ptr就是这么做的,boost::scoped_ptr<T> 基本上等价于const std::auto_ptr<T>
(当然,const std::auto_ptr<T>不能执行reset),之所以叫scoped_ptr是因为这个类强调它的作用只是RAII
其次,auto_ptr最初的目的是帮助程序员管理对象的所有权,它期望用户完全明白它的行为与内部实现(这也是C++被人诟病的地方)。
最后,C++11起,有了移动语义,有了std::unique_ptr,自然也就不需要std::auto_ptr了。std::auto_ptr在C++11中被标记为弃用,在C++17中已经正式移除了。