放弃auto_ptr
并添加unique_ptr
和shared_ptr
。它们是否足以让c ++放弃auto_ptr
?有时候auto_ptr
可能会导致糟糕的结果。谁能举个例子呢?
如果它没有做坏,C ++ 11会保留它而不是放弃。
答案 0 :(得分:4)
因为unique_ptr
是auto_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的最佳功能。