Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2003-05-27 10:48:59


Chuck Messenger wrote:
> Suppose you have this:
>
> struct X {
> shared_ptr<Y> y;
> ...
> };
>
> struct Y {
> X x;
> ....
> };
>
> struct Z {
> Z() : pimpl_(new Y()) { pimpl_->x.y = pimpl_; }
> shared_ptr<Y> pimpl_;
> ...
> };
>
> I'm using the "pimpl" idiom. When I create Z, I create an embedded Y
> ("y"), setting y's x so that it points to y.

Why are you using a shared_ptr<Y> in X? A Y* or a weak_ptr<Y> seems more
appropriate for parent links.

> The problem is that Y will now never die. What I'd like to do is to
> decrement the reference count in x, when I construct the Y:
>
> Z() : pimpl_(new Y()) { pimpl_->x.y = pimpl_;
> pimpl_.decrement_reference_count(); }
>
> This is perfectly sound -- it decrements the reference count from 2 to
> 1. It says, basically, "the mother structure contains a self-referring
> pointer. If that's the only one left, then kill the mother structure."

I wouldn't call it "perfectly sound". A pimpl_->x.y.reset() will leave your
pimpl_ dangling and ~pimpl_ will crash.

> Why do I want to do all this? Well, I could get into the very sound
> reasons if anyone is interested.

Yes, please do.

> It is a technique for avoiding circular shared_ptr references.

What you've shown so far looks like a technique for creating circular
references. ;-)


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk