2

我目前处于这样的情况:

struct A {  
  shared_ptr<B> b;  
};  
struct B {  
  shared_ptr<A> a;  
};

//...
shared_ptr<A> a(new A());
shared_ptr<B> b(new B());  
a->b(b);
b->a(a);

我知道这行不通,因为引用将继续指向彼此。我也被告知weak_ptr解决了这个问题。

但是,weak_ptr没有获取或->重载。我听说过“使用lock()”,但是任何人都可以给出如何正确执行此操作的代码示例吗?

4

4 回答 4

6

我认为这里更大的问题是所有权模糊。你最好决定是A封装B还是相反。如果那不可能,那么您最好引入另一个class C同时拥有A和的人B

假设A拥有B,您可以编写:

classs B;

classs A
{
private:
    boost::scoped_ptr<B> b_;
public:
    A() : b_(new B()) {}
}

class B
{
private:
    A* a_;
public:
    B(A* a) : a_(a) {}
}

等等。scoped_ptr您甚至可以通过使 B 成为局部变量或在析构函数中手动删除它来摆脱它。

Google C++ 样式指南在标题为“智能指针”的部分对此有更多说明。

高温高压

于 2010-08-26T17:14:07.033 回答
2

你检查过weak_ptr上的 boost 参考吗?

shared_ptr<int> p(new int(5));
weak_ptr<int> q(p);

// some time later

if(shared_ptr<int> r = q.lock())
{
    // use *r
}

这个想法是你锁定,weak_ptr从而获得一个shared_ptr确实有运营商。

首先检查,获得的指针是否指向某个东西。Aweak_ptr不会确定资源的生命周期,但它可以让您检查资源是否已经被销毁。

于 2010-08-26T16:48:06.087 回答
-1
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

struct B;

struct A
{
    boost::weak_ptr< B > b;
};

struct B
{
    boost::weak_ptr< A > a;
};

int
main()
{
    boost::shared_ptr<A> a(new A());
    boost::shared_ptr<B> b(new B());
    a->b = b;
    b->a = a; 
    boost::shared_ptr<A> another_a( b->a.lock() );
}

您可以将 aweak_ptr提升为shared_ptrusing weak_ptr::lock

于 2010-08-26T16:49:33.383 回答
-1

现在来吧。

http://boost.org/doc/libs/1_42_0/libs/smart_ptr/weak_ptr.htm

^^^^^ 示例就在那里 ^^^^^^

该死!

于 2010-08-26T16:50:02.993 回答