C ++ 11放弃auto_ptr的原因是什么?

时间:2014-04-18 03:07:11

标签: c++ c++11 smart-pointers

放弃auto_ptr并添加unique_ptrshared_ptr。它们是否足以让c ++放弃auto_ptr?有时候auto_ptr可能会导致糟糕的结果。谁能举个例子呢?

如果它没有做坏,C ++ 11会保留它而不是放弃。

4 个答案:

答案 0 :(得分:4)

因为unique_ptrauto_ptr的更好选择。

特别是,无法在容器中存储auto_ptr。虽然您可以将unique_ptr存储在容器中。

答案 1 :(得分:4)

auto_ptr是可复制构造的,用于移动所有权,例如,

    auto_ptr a;
    ....
    auto_ptr<int> b = a; // a loses its ownership here

这可能会导致混淆和错误。

unique_ptr不是可复制构造的。它是移动可构造的,它可以移动所有权,例如,

    unique_ptr a;
    ....
    unique_ptr<int> b = a; // ERROR, wont compile

    unique_ptr<int> b = std::move(a); // OK, as programmer is explicitly moving ownership, no confusion

    unique_ptr<int> b = unique_ptr(p); // OK, ownership will move from temporary unique_ptr

shared_ptr显然是要分享所有权,所以:

    shared_ptr a;
    ...
    shared_ptr b = a; // both a and b have ownership, underlying pointer will only be freed when a and b both are out of scope

答案 2 :(得分:1)

是的,auto_ptr会导致糟糕的结果。

如果将一个auto_ptr分配给另一个,则第一个指针完全丢失其指针。这是一个令人惊讶的结果,导致错误。

auto_ptr<int> p1(new int(42));
auto_ptr<int> p2 = p1;        // at this point p1 is a bad pointer

unique_ptr是一个更好的选择。

答案 3 :(得分:1)

C ++标准规定,STL元素必须是&#34;可复制的&#34;和&#34;可分配。&#34;必须能够分配或复制元素,并且这两个元素在逻辑上是独立的。 std :: auto_ptr不符合此要求。换句话说,STL容器需要能够复制您存储在其中的项目,并且旨在期望原始和副本等效。自动指针对象具有完全不同的合同,因此复制会创建所有权转移。这意味着auto_ptr的容器将表现出奇怪的行为,具体取决于使用情况。

unique_ptr实际上是直接的auto_ptr替换,它结合了std :: auto_ptr和boost :: scoped_ptr的最佳功能。