_internal_accept_owner now checks if _owned isn't already true.

[SVN r43856]
This commit is contained in:
Peter Dimov
2008-03-25 15:46:40 +00:00
parent af7d4fabad
commit dc6a8f0696
2 changed files with 24 additions and 4 deletions

View File

@ -94,10 +94,18 @@ public:
void _internal_accept_owner(shared_ptr<U> &owner) const
{
init_internal_shared_once();
get_deleter<detail::sp_deleter_wrapper>(_internal_shared_this)->set_deleter(owner);
owner.reset( _internal_shared_this, owner.get() );
_internal_shared_this.reset();
_owned = true;
if( !_owned )
{
detail::sp_deleter_wrapper * pd = get_deleter<detail::sp_deleter_wrapper>(_internal_shared_this);
BOOST_ASSERT( pd != 0 );
pd->set_deleter(owner);
owner.reset( _internal_shared_this, owner.get() );
_internal_shared_this.reset();
_owned = true;
}
}
};

View File

@ -162,11 +162,23 @@ void test3()
BOOST_TEST( pv.get() == p );
}
struct null_deleter
{
void operator()( void const* ) const {}
};
void test4()
{
boost::shared_ptr<V> pv( new V );
boost::shared_ptr<V> pv2( pv.get(), null_deleter() );
}
int main()
{
test();
test2();
test3();
test4();
return boost::report_errors();
}