I have read that weak_pointers can be used to break cyclic references.
Consider the following example of a cyclic reference
struct A
{
boost::shared_ptr<A> shrd_ptr;
};
boost::shared_ptr<A> ptr_A(boost::make_shared<A>());
boost::shared_ptr<A> ptr_b(boost::make_shared<A>());
ptr_A->shrd_ptr = ptr_b;
ptr_b->shrd_ptr = ptr_A;
Now above is a case of cyclic reference and I wanted to know how I can break
the cyclic reference above by using weak_ptr
?
Update : Based on suggestion received I came up with the following :
struct A
{
boost::weak_ptr<A> wk_ptr;
};
boost::shared_ptr<A> ptr_A (boost::make_shared<A>());
boost::shared_ptr<A> ptr_B (boost::make_shared<A>());
ptr_A->wk_ptr = ptr_B;
ptr_B->wk_ptr = ptr_A;
Will this be the correct approach ?
The classic example of cyclic references is where you have two classes
A
andB
whereA
has a reference toB
which has a reference toA
:If both references are
shared_ptr
then that saysA
has ownership ofB
andB
has ownership ofA
, which should ring alarm bells. In other words,A
keepsB
alive andB
keepsA
alive.In this example the instances
a
andb
are only used in theuseAnB()
function so we would like them to be destroyed when the function ends but as we can see when we run the program the destructors are not called.The solution is to decide who owns who. Lets say
A
ownsB
butB
does not ownA
then we replace the reference toA
inB
with aweak_ptr
like so:Then if we run the program we see that
a
andb
are destroyed as we expect.Live demo
Edit: In your case, the approach you suggested looks perfectly valid. Take ownership away from
A
and something else owns theA
s.