$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Fernando Cacciola (fernando_cacciola_at_[hidden])
Date: 2002-11-19 12:51:02
> 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