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
|
void _internal_accept_owner(shared_ptr<U> &owner) const
|
||||||
{
|
{
|
||||||
init_internal_shared_once();
|
init_internal_shared_once();
|
||||||
get_deleter<detail::sp_deleter_wrapper>(_internal_shared_this)->set_deleter(owner);
|
|
||||||
owner.reset( _internal_shared_this, owner.get() );
|
if( !_owned )
|
||||||
_internal_shared_this.reset();
|
{
|
||||||
_owned = true;
|
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 );
|
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()
|
int main()
|
||||||
{
|
{
|
||||||
test();
|
test();
|
||||||
test2();
|
test2();
|
||||||
test3();
|
test3();
|
||||||
|
test4();
|
||||||
|
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user