scoped_ptr和auto_ptr的主要区别

来源:互联网 发布:长沙淘宝设计 编辑:程序博客网 时间:2024/06/07 23:24
scoped_ptr 与 auto_ptr 间的区别主要在于对拥有权的处理。auto_ptr 在复制时会从源 auto_ptr 自动交出
拥有权,而 scoped_ptr 则不允许被复制。看看下面这段程序,它把 scoped_ptr 和 auto_ptr 放在一起,你
可以清楚地看到它们有什么不同。
Beyond the C++ Standard Library : An Introduction to Boost
37
void scoped_vs_auto() {
using boost::scoped_ptr;
using std::auto_ptr;
scoped_ptr<std::string> p_scoped(new std::string("Hello"));
auto_ptr<std::string> p_auto(new std::string("Hello"));
p_scoped->size();
p_auto->size();
scoped_ptr<std::string> p_another_scoped=p_scoped;
auto_ptr<std::string> p_another_auto=p_auto;
p_another_auto->size();
(*p_auto).size();
}
这个例子不能通过编译,因为 scoped_pt r不能被复制构造或被赋值。auto_ptr 既可以复制构造也可以赋值,
但这们同时也意味着它把所有权从 p_auto 转移给了 p_another_auto, 在赋值后 p_auto 将只剩下一个空指针。
这可能会导致令人不快的惊讶,例如你试图把 auto_ptr 放入容器内。[3] 如果我们删掉对 p_another_scoped
的赋值,程序就可以编译了,但它的运行结果是不可预测的,因为它解引用了 p_auto 里的空指针(*p_auto).
[3] 永远不要把 auto_ptr 放入标准库的容器里。如果你试一下,通常你会得到一个编译错误;如
果你没有得到错误,你就麻烦了。
由于 scoped_ptr::get 会返回一个裸指针,所以就有可能对 scoped_ptr 做一些有害的事情,其中有两件是你
尤其要避免的。第一,不要删除这个裸指针。因为它会在 scoped_ptr 被销毁时再一次被删除。第二,不要把这
个裸指针保存到另一个 scoped_ptr (或其它任何的智能指针)里。因为这样也会两次删除这个指针,每个
scoped_ptr 一次。简单地说,尽量少用 get, 除非你要使用那些要求你传送裸指针的遗留代码
原创粉丝点击