Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2003-02-10 12:45:23


dynalink wrote:
> I need to create a single instance of X and have it disappear when
> the
> final B pointer goes out of scope. The problem with this code is that
> A::m_X immediately bumps the ref count and only goes out of scope on
> termination.
>
> Here's a simple example:
>
> class X; // defined elsewhere; in my case wraps a classic C
> structure. typedef boost::smart_ptr<X> X_ptr;
>
> struct A {
> static X_ptr create() { if (!m_X.get()) m_X.reset(new X); return
> m_X; } static X_ptr m_X;
> };
>
> struct B {
> B() : m_A(A::create()){}
> X_ptr m_A;
> };

You need to keep a weak_ptr in A.

struct A
{
    static X_ptr create()
    {
        if(X_ptr px = make_shared(wp_))
        {
            return px;
        }
        else
        {
            X_ptr px(new X);
            wp_ = px;
            return px;
        }
    }

    static weak_ptr<X> wp_;
};


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