【问题标题】:auto_ptr Traps and Pitfallsauto_ptr 陷阱和陷阱
【发布时间】:2010-09-01 19:02:41
【问题描述】:

除了使用 auto_ptrs 的所有已知好处之外,什么是 auto_ptr “最坏的做法”?

  1. 创建 auto_ptrs 的 STL 约束。 auto_ptrs 不满足“CopyConstructable”要求。另见 Scott Meyer 的“Effective STL”,第 8 项。

  2. 创建数组的 auto_ptrs 在销毁时,auto_ptr 的析构函数使用“delete”(而不是“delete[]”)来销毁拥有的对象,因此这段代码会产生未定义的行为: auto_ptr api(new int[42]);

  3. 在使用 auto_ptr 成员的类中不处理 copy-ctor 和 op=。 有人可能天真地认为通过使用 auto_ptr 成员不需要为类实现复制构造函数/赋值运算符。然而,即使是单个 auto_ptr 成员也会“毒害”一个类(即违反“CopyConstructable”和“Assignable”要求)。这些类的对象在复制/赋值操作过程中会部分损坏。

还有更多的 auto_ptr 陷阱吗?

【问题讨论】:

  • 另外,auto_ptr 将在下一个 C++ 标准中被弃用(Sutter 希望在 2011 年 3 月之后正式投票通过 (herbsutter.com/2010/08/28/…),从而成为我们顽固分子的 C++0B )。如果您有 unique_ptr,请改用它。

标签: c++ auto-ptr


【解决方案1】:

不确定这是否是一个陷阱/陷阱,但肯定不是很明显:

  • const auto_ptr 不能将其包含的指针的所有权转移

换句话说:

const auto_ptr<Foo> ap(new Foo());
auto_ptr<Foo> ap2;

ap2 = ap; // Not legal!

如果您想使用 auto_ptr 参数并保证您不会获得所包含指针的所有权,这实际上非常有用,但如果您期望 @ 也可能会令人惊讶987654322@ 表现得像 Foo const*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2011-10-07
    • 2010-10-22
    相关资源
    最近更新 更多