1 2 // shared_from_test.cpp 3 // 4 // Copyright 2019 Peter Dimov 5 // 6 // Distributed under the Boost Software License, Version 1.0. 7 // http://www.boost.org/LICENSE_1_0.txt) 8 9 #include <boost/smart_ptr/enable_shared_from.hpp> 10 #include <boost/shared_ptr.hpp> 11 #include <boost/core/lightweight_test.hpp> 12 13 // 14 15 class X 16 { 17 private: 18 19 int m_; 20 21 public: 22 X()23 X(): m_() {} 24 }; 25 26 class Y: public boost::enable_shared_from 27 { 28 }; 29 30 class Z: public X, public Y 31 { 32 public: 33 shared_from_this()34 boost::shared_ptr<Z> shared_from_this() 35 { 36 return boost::shared_from( this ); 37 } 38 }; 39 null_deleter(void const *)40void null_deleter( void const* ) 41 { 42 } 43 main()44int main() 45 { 46 boost::shared_ptr<Z> p( new Z ); 47 48 try 49 { 50 boost::shared_ptr<Z> q = p->shared_from_this(); 51 52 BOOST_TEST_EQ( p, q ); 53 BOOST_TEST( !( p < q ) && !( q < p ) ); 54 } 55 catch( boost::bad_weak_ptr const & ) 56 { 57 BOOST_ERROR( "p->shared_from_this() failed" ); 58 } 59 60 Z v2( *p ); 61 62 try 63 { 64 boost::shared_ptr<Z> q = v2.shared_from_this(); 65 BOOST_ERROR( "v2.shared_from_this() failed to throw" ); 66 } 67 catch( boost::bad_weak_ptr const & ) 68 { 69 } 70 71 *p = Z(); 72 73 try 74 { 75 boost::shared_ptr<Z> q = p->shared_from_this(); 76 77 BOOST_TEST_EQ( p, q ); 78 BOOST_TEST( !( p < q ) && !( q < p ) ); 79 } 80 catch( boost::bad_weak_ptr const & ) 81 { 82 BOOST_ERROR( "p->shared_from_this() threw bad_weak_ptr after *p = Z()" ); 83 } 84 85 { 86 boost::shared_ptr<Z> p2( p.get(), null_deleter ); 87 } 88 89 try 90 { 91 boost::shared_ptr<Z> q = p->shared_from_this(); 92 93 BOOST_TEST_EQ( p, q ); 94 BOOST_TEST( !( p < q ) && !( q < p ) ); 95 } 96 catch( boost::bad_weak_ptr const& ) 97 { 98 BOOST_ERROR( "p->shared_from_this() failed" ); 99 } 100 101 return boost::report_errors(); 102 } 103