Peter Dimov wrote:
From: "Larry Evans" <[EMAIL PROTECTED]>
[snip]
This doesn't look correct to me... did you mean something like

struct X
{
    Y * p;

    explicit X(Y * p): p(p) {}
    ~X() { delete p; }
};

struct Y
{
    shared_ptr<X> p;
};

int main()
{
    Y * py = new Y;
    shared_ptr<X> px(new X(py));
    py->p = px;
    px.reset();
}

?
Yes.  I had thought about the need to delete the Y* in the
X::DTOR, but that was days ago and I forgot to include it.

I also thought a little more about it and what I was suggesting
was more like:

struc Y;
struct X
{
   boost::unshared_cyclic_ptr<Y> y; //cyclic involves this arc.
   explicit X(void): y(new Y) {}
};
struct Y
{
   boost::shared_cyclic_ptr<X> x;
};

Where {unshared|shared}_cyclic_ptr use the detlef method to
record their offsets and hence enable tracing the pointer graph.

Then I'd imagine you'd ask, why not just use a shared_ptr<Y> instead
of bothering with unshared<Y>.  The only answer I can think of is
that maybe that reflects better the meaning of the variable y.
The programmer knows it's never shared; so, he decides to
be explicit about it with unshared_ptr<Y>.  If he had used
shared_ptr<Y>, then someone maintaining his code would have to wonder
who else is sharing this Y?  Also, the overhead for unshared_ptr
would be at least a little less than shared_ptr (no reference count
or mark bit and no updating the reference count).


_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to