【问题标题】:Should I still use smart pointers if only std::auto_ptr i available?如果只有 std::auto_ptr i 可用,我还应该使用智能指针吗?
【发布时间】:2018-09-28 10:24:40
【问题描述】:

我目前正在处理的项目使用不支持 C++11 的旧编译器,因此没有可用的 unique_ptr 或 shared_ptr。

我应该改用现在已弃用的 auto_ptr 还是应该完全放弃使用智能指针?

【问题讨论】:

  • 如果您决定使用std::auto_ptr,请确保您了解为什么会出现问题。一个例子:gotw.ca/gotw/042.htm
  • 如果系统已经在使用它,我仍然会使用 auto_ptrs。
  • 看看this
  • 您仍然可以使用 RAII 技术来管理内存,并遵循诸如“一个类应该拥有一个资源,或者执行某些功能”之类的良好实践。 auto_ptr 会起作用,只是要格外小心并了解其局限性。在移动语义之前没有真正的方法来创建一个好的“单一所有者”智能指针,但是有很多库提供共享指针。

标签: c++ smart-pointers


【解决方案1】:

如果你可以使用 Boost,它has providedshared_ptr 早在它在 C++11 中被标准化之前,所以一个合适的旧版本的 Boost 应该能够以 '03 兼容的方式提供它。

【讨论】:

  • 这会像在我的项目中包含单个 .h 文件一样简单,还是意味着导入更大的 boost 库?
  • 如果 Boost 失败,编写自己的智能指针也不完全是火箭科学......
  • @cmaster: std::unique_ptr 在 C++11 之前很难。非侵入式共享指针更简单。
  • @Q-bertsuit SmartPtr 确实依赖于 Boost 的其他部分(断言等),但我认为它都是纯标题组件。
  • @Leushenko 这绝对是只有标题的。 Boost 的极少数部分不是。
【解决方案2】:

我建议您离开 std::auto_ptr,因为它计划弃用。

但我会回避使用裸指针。

在 C++11 之前,您可以使用 Boost (www.boost.org) 中提供的智能指针类。如果做不到这一点,您可以滚动自己的版本,以便在标准库中可用时将其删除。请注意,std::shared_ptrstd::unique_ptr 更容易实现,在后一种情况下,我相信您必须放弃可移植性,因为它需要 移动语义 才能正确实现。

【讨论】:

  • 投反对票的人应该在这里发表评论,以便我们知道为什么它被投反对票。这对我来说似乎是一个完美的答案 0.0
  • @RichardCritten:形式上是的,但我们在这里放宽了可移植性。
  • 我认为这与便携性无关。 AFAIK,C++03 无法区分右值和左值,这是实现可转让的唯一所有权所必需的。如果您有办法绕过该限制,最好将其包含在答案中。
  • @Angew:如果我有时间,我会看看一些旧的 StlPort 实验性东西,特别是如果 OP 回来并说之前有 unique_ptr 功能会很有用到 C++11。我也认为 Boost 正在做类似的事情。
  • @Bathsheba IIRR,Boost 有 scoped_ptr 这是不可分配的,然后是 shared_ptr
【解决方案3】:

也许你可以使用std::tr1::shared_ptr

tr1: C++ Technical Report 1 - Wikipedia

【讨论】:

  • 可能值得解释一下tr1 在你的答案中是什么。
  • 我也不相信我有 tr1 可供使用,但谢谢!
猜你喜欢
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2015-04-24
相关资源
最近更新 更多