> -----Original Message-----
> From: Chuck Messenger [mailto:[EMAIL PROTECTED]
> Sent: Thursday, May 29, 2003 4:47 PM
> To: [EMAIL PROTECTED]
> Subject: [boost] Re: Cyclic smart pointers (holy grail: the
> uber-pointer)
> 
> 
> Schoenborn, Oliver wrote:
> 
> >>>- You always have A owns A_impl owns B owns B_impl refs A (what your
> >>>original code seems to say), in this case B_impl contains an RRef<A> 
> >>>instead of a DynObj<A> and everything works
> > 
> > I'd like to hear whether that's your case or not. 
> 
> No.  A and B are completely symmetrical.  They each equally 
> "own" the other.

Not possible. This has nothing to do with NoPtr or boost::shared_ptr, it's
even true for raw pointers. E.g.

// forget about forward declarations for brevity

struct A {
    B* b;
    ~A() {delete b;} // A owns b
};
struct B {
    A* a;
    ~B() {delete a;} // B owns a
};

A* a = new A;
a->b = new B;
a->b->a = a;

delete a;    // *** illegal #1
delete a->b; // *** illegal #2

In illegal#1, a is owned by b means that only b is allowed to delete a, so
calling "delete a" ourselves is illegal (and will lead to double deletion).
In illegal#2, it's b that's being deleted, and same holds as illegal #1. So,
who destroys a and b? No one can and you have a memory leak. 

If on the other hand you have 

struct A {
    B* b;
    ~A() {delete b;} // A owns b
};
struct B {
    A* a; // B does NOT own a
};
 
then delete a is ok, but delete a->b is still not since a->b is owned by a. 

> I looked at NoPtr, and quickly determined that it didn't implement 
> garbage collection, so it couldn't solve my problem.  

That's good, because NoPtr has nothing to do with garbage collection (though
one could perhaps use it for a form of gc).

> However, I don't understand what NoPtr *does*.

Simplistically, 
- DynObj destroys what it owns when it goes out of scope, is reset or
acquires something new, and notifies any RRefs linked to it
- RRef refers to a DynObj, but asserts that DynObj still exists when
accessed

Note that I said simplistically.

Oliver

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

Reply via email to