2012-06-21 34 views
3

我想我可能需要做這樣的事情在我的應用程序下面的僞代碼:升壓shared_ptr的默認構造函數中使用

boost::shared_ptr<T> p; 
... 
... 
p = boost::shared_ptr<T>(new T); 

我知道有使用賦值運算符的其他選項,但我注意到在boost::shared_ptr文檔/例子,他們從來沒有討論過這種涉及默認構造函數的情況。

我想我的問題是:這是有效的用途嗎?換句話說,它是否合法,是否會導致潛在的內存泄漏?欣賞任何想法/更正。非常感謝!

注意:我還記得閱讀,以及下面的一些評論表明,他們建議在調用構造函數new時始終使用名爲shared_ptr。不過,我很難想象這可能會造成任何傷害。如果你有他們,請張貼任何反例。謝謝!

+3

這違反安全使用智能指針的#1規則:[「總是使用一個命名的智能指針變量來保存結果「(http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm)(代碼就像_appears_對我來說很安全,因爲'operator ='被指定爲非-throwing。然而,最好遵循這個最佳做法_所有的時間。這是很好的養成良好的習慣,它可以幫助你不必擔心你的代碼是否安全。) –

+0

是的,我記得在文件..因此,這個問題。雖然似乎無傷大雅。這怎麼能打破任何東西? –

+0

@ squashed.bugaboo:能夠打破任何東西,更多的是因爲地道和不令人驚訝。 – ildjarn

回答

4

這是完全合法和記憶安全的。您調用上T默認的構造函數的事實是無關緊要的:只要你有一個動態分配的對象,你可以用它在一個shared_ptr<>

如果你指的shared_ptr<>默認的構造函數,也沒關係:包裹指針爲NULL,當其他shared_ptr<>分配

將不會被刪除

你必須要小心,雖然檢查內容是否NULL與否,否則你可能會訪問一個無效的指針

+0

我已經選擇了這個作爲答案,因爲我已經嘗試過了,它適用於我,並且所有地獄都沒有失散。但是我想承認,它違反了使用shared_ptr附帶的建議。謝謝。 –