I started a new thread because the old one was getting hard to
follow on my newsreader from the excessive nesting.  I realized
there is yet another problem with my scheme (which should come
as no suprise by now).  This time, the problem is the copy c'tor.
Here's a recap:

    storage::storage(storage const& rhs)
    : pointee_(rhs.pointee_)
    { }

    storage::~storage()
    { checked_delete(pointee_); }

    void storage::release()
    { pointee_ = default_value(); }

    ref_counted::ref_counted(ref_counted const& rhs)
    : count_(rhs.count_)
    { }

    ref_counted::~ref_counted()
    { delete count_; }

    bool ref_counted::release(P const& p)
    {
        if (!--*count_) return true;
        count_ = 0; return false;
    }

    smart_ptr::smart_ptr(smart_ptr const& rhs)
    : storage(rhs), ownership(rhs), checking(rhs), conversion(rhs)
    { checking::on_init(p); }

    smart_ptr::~smart_ptr()
    {
        if (!ownership::release(get_impl(*this)))
        {
            storage::release();
        }
    }

The problem is that while ref_counted indeed cleans up its count in
the face of later exceptions, it may do so prematurely.  For instance,
if checking(rhs) were to throw, ~smart_ptr() does not get a chance
to call ownership::release(), which prevents ownership from deleting
the count.  Similarly, if, for some reason, ownership(rhs) were to
throw, storage might prematurely free the resource.  The two most
viable solutions I can think of are:

A) add scope guards to make sure the right thing is done no matter
who throws

B) require that copying be no-throw

The problem with A) is that it imposes a performance penalty on
copying, which might be seen as undesirable.  The problem with B)
is that deep_copy would probably like to throw.  I guess there is
a third option:

C) require no-throw semantics only for certain policy configurations

Which is, of course, what I've already suggested for the P const& p
c'tors.  Comments?

Dave



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

Reply via email to