Schoenborn, Oliver wrote:
NoPtr lib -- noptrlib.sourceforge.net

...I saw no mention of detecting dead cyclic object pools.

Can you give me a short example of how NoPtr would even need to detect that
to work correctly? I suspect that if you end up with cyclic object pool you
are using NoPtr incorrectly (just like passing a pointer to an auto variable
to a shared_ptr is incorrect use), but maybe an example will show me to be
wrong.


Oliver

Here's my example (from an earlier thread):


    #include <boost/shared_ptr.hpp>
    #include <iostream>

    using namespace boost;
    using namespace std;


struct B_impl;


    struct B {
        shared_ptr<B_impl> pimpl_;
    };

    struct A_impl {
        A_impl() { cout << "new A\n"; }
        ~A_impl() { cout << "del A\n"; }
        B b_;
    };

    struct A {
        shared_ptr<A_impl> pimpl_;
        B get_B() const { return pimpl_->b_; }
    };

    struct B_impl {
        B_impl() { cout << "new B\n"; }
        ~B_impl() { cout << "del B\n"; }
        A a_;
    };

    A get_A(const B& b) { return b.pimpl_->a_; }
    B get_B(const A& a) { return a.pimpl_->b_; }

    A construct_A() {
        A a;
        a.pimpl_.reset(new A_impl);  // a refcount is 1
        B& b = a.pimpl_->b_;
        b.pimpl_.reset(new B_impl);  // b refcount is 1
        b.pimpl_->a_ = a;            // a refcount is 2

        return a;
    }

    int main() {
        {
            A a = construct_A();
        }
        // ex-a's refcount is still 1, so object doesn't die
    }


- Chuck



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

Reply via email to