forked from boostorg/smart_ptr
_internal_accept_owner now checks if _owned isn't already true.
[SVN r43856]
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user