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