【问题标题】:Should I stop using auto_ptr?我应该停止使用 auto_ptr 吗?
【发布时间】:2010-08-10 14:42:23
【问题描述】:

我最近开始欣赏std::auto_ptr,现在我读到它将是deprecated。我开始在两种情况下使用它:

  • 工厂的返回值
  • 传达所有权转让

例子:

// Exception safe and makes it clear that the caller has ownership.
std::auto_ptr<Component> ComponentFactory::Create() { ... }

// The receiving method/function takes ownership of the pointer. Zero ambiguity.
void setValue(std::auto_ptr<Value> inValue);

尽管存在有问题的复制语义,但我发现 auto_ptr 很有用。上面的例子似乎没有替代方案。

我应该继续使用它然后切换到std::unique_ptr吗?还是应该避免?

【问题讨论】:

  • 无论你在做什么项目,我都会坚持使用auto_ptr,并在你开始新事物时切换,这样你就不会因为将它们混合在一起而造成复杂性。 (我假设您使用的编译器支持unique_ptr。)
  • std::auto_ptr 被弃用不是因为它没有用,而是因为std::unique_ptr 做了它已经做的一切,只是更好。所以无论你是否切换到std::unique_ptr,都没有理由停止使用std::auto_ptr
  • Eric Lippert 很久以前就写过这篇文章。读起来很有趣:blogs.msdn.com/b/ericlippert/archive/2003/09/16/53016.aspx
  • @Mike:我真的不明白它是如何应用的。所以 COM refcounting 是一团糟,他写了一些非法代码,当他还涉及(写得不好)智能指针时,这些代码碰巧爆炸了。几乎没有告诉我们太多关于在健全的 C++ 代码中使用的 sane 智能指针类。
  • @jalf 嘿,我不知道。我只是添加一些信息。

标签: c++


【解决方案1】:

尽管存在缺陷,但它非常非常有用,我强烈建议您继续使用它并在可用时切换到 unique_ptr

::std::unique_ptr 需要一个支持右值引用的编译器,右值引用是 C++0x 草案标准的一部分,并且需要一段时间才能得到真正广泛的支持。在右值引用可用之前,::std::auto_ptr 是您能做的最好的。

在您的代码中同时包含 ::std::auto_ptr::std::unique_ptr 可能会使某些人感到困惑。但是当您决定更改它时,您应该能够搜索和替换::std::unique_ptr。如果这样做,您可能会遇到编译器错误,但它们应该很容易修复。对this question about replacing ::std::auto_ptr with ::std::unique_tr 的评分最高的答案有更多详细信息。

【讨论】:

  • 但在一个项目中保持一致。没有什么比拥有两种做同样事情但名称不同的类型更糟糕的了。
  • 从技术上讲,unique_ptr 不是auto_ptr 的直接替代品。除其他外,它将可能的运行时崩溃更改为明确的编译器错误。这通常是一件好事,因此您可能希望在可用时进行查找替换,以修复由此触发的任何编译器错误。见stackoverflow.com/questions/3451099
  • @Brian - 谢谢你的链接。我将在早上的回答中包含您的说明和该链接。 :-)
【解决方案2】:

弃用并不意味着它会消失,只是会有更好的替代品。

我建议在当前代码上继续使用它,但在新代码上使用新的替代方案(新程序或模块,而不是对当前代码进行小的更改)。一致性很重要

【讨论】:

  • 这确实意味着它可能在未来的某个时候消失。
【解决方案3】:

我建议你使用 boost 智能指针。

【讨论】:

  • 他们解决不了同样的问题。 Boost 不是万能的,无论它多么有用。
  • boost 智能指针会承担一定的开销。 shared_ptr 进行额外的内存分配,intrusive_ptr 需要嵌入式计数器。 auto_ptr 还没有很好的替代品。
  • Omni 所说的。 boost 的智能指针都不支持所有权转移,因为标准库已经提供了该功能,并且在当前标准中是可能的。如果std::auto_ptr 有效,那么使用boost 的任何一个共享指针几乎肯定是一个错误[boost::scoped_ptr 可能就足够了,但这些情况相对有限]
  • 我已经在使用 boost 智能指针了。对于局部变量和成员变量,我使用 scoped_ptr,用于容器 shared_ptr。但是,这些不会“传达”所有权转让。
  • @Maxim Yegorushkin - 有时可以使用 boost::make_shared 绕过额外分配。
猜你喜欢
  • 2022-06-10
  • 2012-05-28
  • 1970-01-01
  • 2014-06-02
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
相关资源
最近更新 更多