簡體   English   中英

可升級指針(unique_ptr - > shared_ptr)

[英]Upgradeable pointer (unique_ptr -> shared_ptr)

我被告知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_;
  }
}

std::shared_ptrstd::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());
}

另一方面,降級不能這么容易,因為沒有辦法告訴std::shared_ptr停止管理某個對象。

希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM