已经有几个关于这个主题的问题,但我仍然不确定该怎么做:我们的代码库在很多地方使用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