【问题标题】:C++11 Smart Pointer PoliciesC++11 智能指针策略
【发布时间】:2012-01-10 05:12:06
【问题描述】:

据我了解,在当前的 C++11 规范中,应该使用:

  • std::unique_ptr<> 一位所有者(大部分时间)
  • std::shared_ptr<> 仅当非循环结构中有多个所有者时
  • std::weak_ptr<> 仅在需要打破循环时才谨慎使用
  • 当引用不足时,将原始指针用作内存句柄(无所有权)

所以我的问题是:

  1. 这些策略是否足够,或者是否有其他策略可以 我应该知道吗?
  2. scoped_ptr<>auto_ptr<> 是否已经过时?

【问题讨论】:

  • auto_ptr<> 现已弃用。

标签: c++ memory-management c++11 smart-pointers


【解决方案1】:

scoped_ptr 和 auto_ptr 是否已经过时了?

auto_ptr 在 C++11 中已被弃用,所以这就是你的答案。 scoped_ptr 在 C++11 中不存在,也从未存在过。使用boost::scoped_ptr 的主要原因是确保所有权永远不会转移(当然,除非你作弊)。再说一次,如果您使用unique_ptr,则只有在您使用std::move 或类似结构时才能转移所有权。或者,正如霍华德所指出的,只需将其设为 const std::unique_ptr

因此,是否需要额外的保险完全取决于您。 boost::scoped_ptr 也没有删除器支持。所以unique_ptr 可以玩boost::scoped_ptr 不能玩的把戏。

std::weak_ptr 仅在需要打破循环时才谨慎使用

我不能说我一定同意这项政策。 weak_ptr 应该用于当一个对象可能想与其他东西交谈,但它不拥有其他东西。这意味着它可以随时被删除,并且weak_ptr 的持有者需要能够在任何尝试与之交谈时处理该删除。

打破循环是weak_ptr一种用法;它不应该是唯一一次使用。

【讨论】:

  • +1 附加信息:const unique_ptrboost::scoped_ptr 更强有力地声明所有权不会超出范围。后者可以超出范围而前者不能。
  • @HowardHinnant:只是出于好奇,在哪些情况下您希望在堆上分配如此短暂的东西?如果对象对于堆栈来说太大了?
  • @kfmfe04:我发现自己没有使用const unique_ptr(或boost::scoped_ptr)。我确实使用了相当数量的本地unique_ptr,但这通常是出于异常安全原因:在我获取其他资源时安全地持有资源,然后将资源从本地unique_ptr 转移到另一个更永久的对象。话虽如此,我知道boost::scoped_ptr 有很多粉丝,我确信他们的用例是有效的。
  • @HowardHinnant:+1 分享您的见解
  • 另外,你可以用unique_ptrs 填充一个容器,让它们比持有对象更快地被洗牌或重组,但不必担心在将它们从容器中删除之前删除它们容器,就像它们持有原始指针一样。
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 2021-12-26
  • 2019-06-30
  • 2019-06-02
  • 1970-01-01
相关资源
最近更新 更多