簡體   English   中英

從弱指針返回類型返回共享指針

[英]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_ptrweak_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.

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