可升级指针(unique_ptr - > shared_ptr)

时间:2015-07-14 02:00:28

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

我被告知shared_ptrunique_ptr慢得多,所以你应该尽可能努力使用unique_ptr。我有一个潜在的用例,其中一个对象在大多数情况下将拥有一个所有者,但在某些情况下可能有多个所有者。在这种情况下,是否存在unique_ptr的任何类型的实现,可以在需要时升级到shared_ptr,而不是首先将所有内容都声明为shared_ptr

IE而不是使用shared_ptr,如果我使用类似下面的内容,如果升级的情况非常罕见,或者是否有一些我在这里看不到的陷阱,那会更有利吗?

class upgrade_ptr<T> {
  shared_ptr<T> shared_;
  unique_ptr<T> unique_;
  upgrade_ptr(T obj) {
    unique_ = unique_ptr<T>(obj);
  }
  shared_ptr<T> share() {
    if (shared_ == nullptr) {
      shared_ = shared_ptr<T>(unique_);
    }
    return shared_;
  }
}

1 个答案:

答案 0 :(得分:3)

activitystd::shared_ptr慢,因为它跟踪管理同一对象的std::unique_ptr个实例的数量。 std::shared_ptr个实例不执行此操作。这意味着,每次调用std::unique_ptr实例的析构函数时,托管对象也会被删除,而std::unique_ptr实例仅在托管对象是销毁该对象的最后一个实例时才删除托管对象。

话虽如此,您的升级功能可能看起来像这样:

std::shared_ptr

另一方面,降级并非易事,因为没有办法告诉template<class T> std::shared_ptr<T> upgradePointer(std::unique_ptr<T> &u) { return std::shared_ptr<T>(u.release()); } 停止管理某个对象。

希望有帮助。