From dc6a8f069643b5dda0ef1b113a6d3852a83be464 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 25 Mar 2008 15:46:40 +0000 Subject: [PATCH] _internal_accept_owner now checks if _owned isn't already true. [SVN r43856] --- include/boost/enable_shared_from_this.hpp | 16 ++++++++++++---- test/esft_regtest.cpp | 12 ++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/boost/enable_shared_from_this.hpp b/include/boost/enable_shared_from_this.hpp index f378272..2ead3fd 100644 --- a/include/boost/enable_shared_from_this.hpp +++ b/include/boost/enable_shared_from_this.hpp @@ -94,10 +94,18 @@ public: void _internal_accept_owner(shared_ptr &owner) const { init_internal_shared_once(); - get_deleter(_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(_internal_shared_this); + BOOST_ASSERT( pd != 0 ); + pd->set_deleter(owner); + + owner.reset( _internal_shared_this, owner.get() ); + _internal_shared_this.reset(); + + _owned = true; + } } }; diff --git a/test/esft_regtest.cpp b/test/esft_regtest.cpp index 8bc8cd6..35f672e 100644 --- a/test/esft_regtest.cpp +++ b/test/esft_regtest.cpp @@ -162,11 +162,23 @@ void test3() BOOST_TEST( pv.get() == p ); } +struct null_deleter +{ + void operator()( void const* ) const {} +}; + +void test4() +{ + boost::shared_ptr pv( new V ); + boost::shared_ptr pv2( pv.get(), null_deleter() ); +} + int main() { test(); test2(); test3(); + test4(); return boost::report_errors(); }