[英]Resetting nested smart pointer of a shared_ptr to a shared_ptr (or to a unique_ptr), seeming paradox
[英]Upgradeable pointer (unique_ptr -> shared_ptr)
我被告知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_;
}
}
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());
}
另一方面,降級不能這么容易,因為沒有辦法告訴std::shared_ptr
停止管理某個對象。
希望有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.