C++ C++;11放弃自动检查?
它放弃了C++ C++;11放弃自动检查?,c++,c++11,smart-pointers,C++,C++11,Smart Pointers,它放弃了auto_ptr,添加了unique_ptr和shared_ptr。它们是否足够好让C++放弃 AutoPPTR ?有时必须有自动\u ptr可能导致不良结果。谁能给我举个例子吗 如果它不坏,C++11将保留它,而不是放弃。因为unique\u ptr是auto\u ptr的更好选择 特别是,无法在容器中存储auto_ptr。虽然您可以在容器中存储unique\u ptr。是的,auto\u ptr会导致不良结果 如果将一个auto_ptr分配给另一个,则第一个指针将完全丢失其指针。这是
auto_ptr
,添加了unique_ptr
和shared_ptr
。它们是否足够好让C++放弃<代码> AutoPPTR <代码>?有时必须有自动\u ptr
可能导致不良结果。谁能给我举个例子吗
如果它不坏,C++11将保留它,而不是放弃。因为
unique\u ptr
是auto\u ptr
的更好选择
特别是,无法在容器中存储
auto_ptr
。虽然您可以在容器中存储unique\u ptr
。是的,auto\u ptr
会导致不良结果
如果将一个auto_ptr
分配给另一个,则第一个指针将完全丢失其指针。这是一个令人惊讶的结果,会导致错误
auto_ptr<int> p1(new int(42));
auto_ptr<int> p2 = p1; // at this point p1 is a bad pointer
auto_ptr p1(新int(42));
自动_ptr p2=p1;//此时p1是一个错误的指针
<代码> UNQUIQU-PTR 是一个更好的选择。
< P> C++标准称STL元素必须是“复制可构造”和“可分配”。必须能够分配或复制一个元素,并且这两个元素在逻辑上是独立的。std::auto_ptr不满足此要求。换句话说,STL容器需要能够复制存储在其中的项目,并且设计为期望原始和副本是等效的。自动指针对象有一个完全不同的契约,通过复制可以创建所有权转移。这意味着auto_ptr的容器将根据使用情况表现出奇怪的行为unique_ptr实际上是直接自动_ptr的替代品,它结合了std::auto_ptr和boost::Scope_ptr的最佳功能。auto_ptr是可复制的,用于移动所有权,例如
auto_ptr a;
....
auto_ptr<int> b = a; // a loses its ownership here
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
实际上,从函数返回
auto_ptr
是没有问题的。这是它唯一擅长的事情之一。@Markransem你是对的,更正。这是有道理的,因为它转移了所有权,我一定对它的用法记性不好。除了其他答案,这些都是好的,通过make_unique
或make_shared
使用unique_ptr
和shared_ptr
比使用普通的auto_ptr
构造函数(内置新的操作符)更有效。记下“大师问题4”:同意。只需添加unique_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