已經有幾個關於這個主題的問題,但我仍然不確定該怎麼做:我們的代碼庫在很多地方使用shared_ptr
。我不得不承認,我們在寫作時沒有明確界定所有權。傳遞給方法時,我應該將shared_ptr轉換爲weak_ptr嗎?
我們有像
void doSomething(shared_ptr<MyClass> ptr)
{
//doSomething() is a member function of a class, but usually won't store the ptr
ptr->foo();
...
}
一些方法已經發現了第一個(間接)循環依賴我想糾正在我們的設計中的錯誤之後。但我不確定如何。從上面改變方法是否有任何好處
void doSomething(weak_ptr<MyClass> ptr)
{
shared_ptr<MyClass> ptrShared = ptr.lock();
ptrShared->foo();
...
}
?
我也很困惑,因爲有些人說(包括谷歌風格指南),首先獲得所有權是很重要的(這可能意味着引入很多weak_ptrs
,例如在上面的方法的例子中,但也爲我們有很多成員變量)。其他人說(請參閱下面的鏈接),您應該使用weak_ptr來打破循環依賴關係。然而,檢測它們並不總是很容易,所以我想知道是否真的應該使用shared_ptr,直到遇到問題(並意識到它們),然後修復它們?
感謝您的想法!
也
- shared_ptr and weak_ptr differences
- boost::shared_ptr cycle break with weak_ptr
- boost, shared ptr Vs weak ptr? Which to use when?
Would shared_ptr&ptr be better? –
DanDan
2011-03-23 16:01:00
「檢測它們並不容易」 - 然後確實需要在設計過程中添加更多步驟。班級關係圖上的明暗線條,或任何需要的東西。你也可以考慮用原始指針而不是弱指針來破壞循環,對於大多數不對稱關係來說,「所有者」永遠不會在所有「非所有者」之前被破壞。 – 2011-03-23 16:01:44
@DanDan:我不這麼認爲,請參閱http://stackoverflow.com/questions/327573/c-passing-references-to-boostshared-ptr – Philipp 2011-03-23 16:03:29