> Borland C++ 5.5.1 fails the following test:
>
> struct X
> {
>     X(): next() {}
>     boost::shared_ptr<X> next;
> };
>
> void test()
> {
>     boost::shared_ptr<X> p(new X);
>     p->next = boost::shared_ptr<X>(new X);
>     BOOST_TEST(!p->next->next);
>     p = p->next;
>     BOOST_TEST(!p->next); // here
> }
>
The problem is here;

   p = p->next;

This assignment is slicing. It is directly calling

    shared_count & operator= (shared_count const & r) // nothrow

on the lvalue (p). The pointee (p.px)  is destroyed during "pi_->release();"
but is not re-assigned.

If the intention was that the assignment use:

    template<typename Y>
    shared_ptr & operator=(shared_ptr<Y> const & r) // never throws

then Borland doesn't use it.

A solution is to add a non-template assignment, at least only for bcc5.5.1,
as:

    shared_ptr & operator=(shared_ptr const & r) // never throws
    {
        px = r.px;
        pn = r.pn; // shared_count::op= doesn't throw
        return *this;
    }

With this additional assignment, the test passes.

Can't check with other Borland compilers.

Fernando Cacciola

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

Reply via email to