我被告知shared_ptr
比unique_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_;
}
}
答案 0 :(得分:3)
activity
比std::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());
}
停止管理某个对象。
希望有帮助。