[英]Returning a shared pointer from a weak pointer return type
這樣做安全嗎? 為什么我的IDE會警告我呢?
std::weak_ptr<SomeClass> getStatus()
{
return _mStatus;
}
private:
std::shared_ptr<SomeClass> _mStatus = std::make_shared<SomeClass>();
我的IDE說明:
從返回
std::weak_ptr<SomeClass>
的函數返回std::shared_ptr<SomeClass>
std::weak_ptr<SomeClass>
。 類std::shared_ptr<SomeClass>
與類std::weak_ptr<SomeClass>
不兼容
這樣安全嗎? 我應該忽略這個警告嗎? 我在這里遇到了一個崩潰,我認為這可能是一個原因。
你的IDE錯了; 代碼很好。 存在從shared_ptr
到weak_ptr
的隱式轉換; 從返回類型為weak_ptr
的函數返回shared_ptr
只會調用轉換。 我剛用三個不同的編譯器(gcc 8.3,msvc 2019,xcode 10)測試了你的代碼,他們都進行了轉換而沒有任何警告。 返回weak_ptr
是完全安全的,因為如果原始shared_ptr
消失,它將自動變為null,這里沒有懸空指針的危險。
錯誤消息似乎暗示您的編譯器認為轉換無效; 也許你正在使用標准庫的舊版本? 我不記得是否有一個weak_ptr
的草案版本,其中shared_ptr
的轉換是顯式的或需要函數調用。
我的理解是,雖然shared_ptr確實引用了計數,但weak_ptr卻沒有。 那么,這是否安全取決於您如何使用它。 風險在於你將weak_ptr返回到_mStatus
然后擁有對象(具有對它的shared_ptr引用)消失,導致ref-count為零,因此釋放了內存但是你的weak_ptr引用現在引用了釋放內存造成混亂。 現在,weak_ptr有一個保護,如果你從它獲得值並且它已經被釋放它將給你一個新的init'ed指針(即空指針)。 但是,如果調用者獲取weak_ptr並從中獲取指針值(可能復制到原始指針類型)然后擁有對象消失,那么原始指針值現在是假的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.