为什么使用 std::auto_ptr<> 是错误的 用标准容器?

发布于 2024-07-05 08:52:04 字数 51 浏览 11 评论 0 原文

为什么在标准容器中使用 std::auto_ptr 是错误的?

Why is it wrong to use std::auto_ptr<> with standard containers?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

森林散布 2024-07-12 08:52:04

C++ 标准规定 STL 元素必须是“可复制构造的”和“可赋值的”。 换句话说,一个元素必须能够被赋值或复制,并且两个元素在逻辑上是独立的。 std::auto_ptr 不满足此要求。

以此代码为例:

class X
{
};

std::vector<std::auto_ptr<X> > vecX;
vecX.push_back(new X);

std::auto_ptr<X> pX = vecX[0];  // vecX[0] is assigned NULL.

要克服此限制,您应该使用 std ::unique_ptrstd::shared_ptr std::weak_ptr 智能指针或 boost 等效项(如果您没有 C++11)。 这里是这些智能指针的 boost 库文档。

The C++ Standard says that an STL element must be "copy-constructible" and "assignable." In other words, an element must be able to be assigned or copied and the two elements are logically independent. std::auto_ptr does not fulfill this requirement.

Take for example this code:

class X
{
};

std::vector<std::auto_ptr<X> > vecX;
vecX.push_back(new X);

std::auto_ptr<X> pX = vecX[0];  // vecX[0] is assigned NULL.

To overcome this limitation, you should use the std::unique_ptr, std::shared_ptr or std::weak_ptr smart pointers or the boost equivalents if you don't have C++11. Here is the boost library documentation for these smart pointers.

唔猫 2024-07-12 08:52:04

auto_ptr复制语义与容器不兼容。

具体来说,将一个 auto_ptr 复制到另一个并不会创建两个相等的对象,因为一个对象已经失去了指针的所有权。

更具体地说,复制 auto_ptr 会导致其中一个副本释放指针。 其中哪些保留在容器中尚未定义。 因此,如果将 auto_ptrs 存储在容器中,您可能会随机失去对指针的访问权限。

The copy semantics of auto_ptr are not compatible with the containers.

Specifically, copying one auto_ptr to another does not create two equal objects since one has lost its ownership of the pointer.

More specifically, copying an auto_ptr causes one of the copies to let go of the pointer. Which of these remains in the container is not defined. Therefore, you can randomly lose access to pointers if you store auto_ptrs in the containers.

(り薆情海 2024-07-12 08:52:04

STL 容器存储所包含项目的副本。 当复制 auto_ptr 时,它将旧的 ptr 设置为 null。 许多容器方法都会被这种行为破坏。

STL containers store copies of contained items. When an auto_ptr is copied, it sets the old ptr to null. Many container methods are broken by this behavior.

吹泡泡o 2024-07-12 08:52:04

C++03 标准 (ISO-IEC 14882-2003) 在第 20.4.5 条第 3 段中表示:

[...]
[注意:[...]
auto_ptr 不满足标准库的可复制构造和可分配要求
容器元素,从而实例化标准库容器
使用 auto_ptr 会导致未定义的行为。 - 尾注
]

C++11 标准 (ISO-IEC 14882-2011) 在附录 D.10.1 第 3 段中表示:

[...]
注意:[...] auto_ptr 的实例满足以下要求
MoveConstructible 和 MoveAssignable,但不满足要求
CopyConstructible 和 CopyAssignable。 - 尾注]

C++14 标准 (ISO-IEC 14882-2014) 在附录 C.4.2 中说明
附录 D:兼容性特征:

更改:类模板 auto_ptr、unary_function 和 binary_function、函数模板 random_shuffle 以及
函数模板(及其返回类型)ptr_fun、mem_fun、
mem_fun_ref、bind1st 和 bind2nd 未定义。
理由:被新功能取代。
对原始功能的影响:使用这些类模板和函数模板的有效 C ++ 2014 代码可能无法在此编译
国际标准。

C++03 Standard (ISO-IEC 14882-2003) says in clause 20.4.5 paragraph 3:

[...]
[Note: [...]
auto_ptr does not meet the CopyConstructible and Assignable requirements for Standard Library
container elements and thus instantiating a Standard Library container
with an auto_ptr results in undefined behavior. — end note
]

C++11 Standard (ISO-IEC 14882-2011) says in appendix D.10.1 paragraph 3:

[...]
Note: [...] Instances of auto_ptr meet the requirements of
MoveConstructible and MoveAssignable, but do not meet the requirements
of CopyConstructible and CopyAssignable. — end note ]

C++14 Standard (ISO-IEC 14882-2014) says in appendix C.4.2
Annex D: compatibility features:

Change: The class templates auto_ptr, unary_function, and binary_function, the function templates random_shuffle, and the
function templates (and their return types) ptr_fun, mem_fun,
mem_fun_ref, bind1st, and bind2nd are not defined.
Rationale: Superseded by new features.
Effect on original feature: Valid C ++ 2014 code that uses these class templates and function templates may fail to compile in this
International Standard.

他是夢罘是命 2024-07-12 08:52:04

STL 容器需要能够复制存储在其中的项目,并且被设计为期望原始和副本是等效的。 自动指针对象具有完全不同的契约,通过复制创建所有权转移。 这意味着 auto_ptr 的容器将根据使用情况表现出奇怪的行为。

在Effective STL (Scott Meyers) 第 8 项中有对可能出错的地方的详细描述,在Effective C++ (Scott Meyers) 第 13 项中也有不太详细的描述。

The STL containers need to be able to copy the items you store in them, and are designed to expect the original and the copy to be equivalent. auto pointer objects have a completely different contract, whereby copying creates a transfer of ownership. This means that containers of auto_ptr will exhibit strange behaviour, depending on usage.

There is a detailed description of what can go wrong in Effective STL (Scott Meyers) item 8 and also a not-so-detailed description in Effective C++ (Scott Meyers) item 13.

冬天旳寂寞 2024-07-12 08:52:04

关于这个主题的两篇超级优秀的文章:

Two super excellent articles on the subject:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文