我目前的情况如下:
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()
”,但是有人能举例说明如何正确执行此操作吗?
答案 0 :(得分:6)
我认为这里更大的问题是模糊的所有权。您最好决定A
是否封装B
或其他方式。如果无法做到这一点,那么您最好还介绍另一个拥有class C
和A
的{{1}}。
假设B
拥有A
,您可以写:
B
等等。您甚至可以通过使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) {}
}
。
Google C++ Style Guide在标题为“Smart Pointers”的部分中有更多内容可以说明。
HTH
答案 1 :(得分:2)
您是否检查了weak_ptr上的提升参考?
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
。
首先检查获得的指针是否指向某个东西。 weak_ptr
不确定资源的生命周期,但它可以让您检查资源是否已被销毁。
答案 2 :(得分:-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() );
}
您可以使用weak_ptr
将shared_ptr
宣传为weak_ptr::lock
。
答案 3 :(得分:-1)