5

除了使用 auto_ptr 的所有已知好处之外,什么是 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 陷阱吗?

4

1 回答 1

6

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

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

换句话说:

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

ap2 = ap; // Not legal!

如果您想采用 auto_ptr 参数并保证您不会获得所包含指针的所有权,这实际上非常有用const auto_ptr<Foo>,但如果您希望 a表现得像 a ,这也会令人惊讶Foo const*

于 2010-09-01T19:11:38.503 回答