1 // 2 // shared_ptr_move_test.cpp 3 // 4 // Copyright (c) 2007 Peter Dimov 5 // 6 // Distributed under the Boost Software License, Version 1.0. 7 // See accompanying file LICENSE_1_0.txt or copy at 8 // http://www.boost.org/LICENSE_1_0.txt 9 // 10 11 #include <boost/shared_ptr.hpp> 12 #include <boost/detail/lightweight_test.hpp> 13 #include <utility> 14 15 #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) 16 17 struct X 18 { 19 static long instances; 20 XX21 X() 22 { 23 ++instances; 24 } 25 ~XX26 ~X() 27 { 28 --instances; 29 } 30 31 private: 32 33 X( X const & ); 34 X & operator=( X const & ); 35 }; 36 37 long X::instances = 0; 38 main()39int main() 40 { 41 BOOST_TEST( X::instances == 0 ); 42 43 { 44 boost::shared_ptr<X> p( new X ); 45 BOOST_TEST( X::instances == 1 ); 46 47 boost::shared_ptr<X> p2( std::move( p ) ); 48 BOOST_TEST( X::instances == 1 ); 49 BOOST_TEST( p.get() == 0 ); 50 51 boost::shared_ptr<void> p3( std::move( p2 ) ); 52 BOOST_TEST( X::instances == 1 ); 53 BOOST_TEST( p2.get() == 0 ); 54 55 p3.reset(); 56 BOOST_TEST( X::instances == 0 ); 57 } 58 59 { 60 boost::shared_ptr<X> p( new X ); 61 BOOST_TEST( X::instances == 1 ); 62 63 boost::shared_ptr<X> p2; 64 p2 = std::move( p ); 65 BOOST_TEST( X::instances == 1 ); 66 BOOST_TEST( p.get() == 0 ); 67 68 boost::shared_ptr<void> p3; 69 p3 = std::move( p2 ); 70 BOOST_TEST( X::instances == 1 ); 71 BOOST_TEST( p2.get() == 0 ); 72 73 p3.reset(); 74 BOOST_TEST( X::instances == 0 ); 75 } 76 77 { 78 boost::shared_ptr<X> p( new X ); 79 BOOST_TEST( X::instances == 1 ); 80 81 boost::shared_ptr<X> p2( new X ); 82 BOOST_TEST( X::instances == 2 ); 83 p2 = std::move( p ); 84 BOOST_TEST( X::instances == 1 ); 85 BOOST_TEST( p.get() == 0 ); 86 87 boost::shared_ptr<void> p3( new X ); 88 BOOST_TEST( X::instances == 2 ); 89 p3 = std::move( p2 ); 90 BOOST_TEST( X::instances == 1 ); 91 BOOST_TEST( p2.get() == 0 ); 92 93 p3.reset(); 94 BOOST_TEST( X::instances == 0 ); 95 } 96 97 return boost::report_errors(); 98 } 99 100 #else // defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) 101 main()102int main() 103 { 104 return 0; 105 } 106 107 #endif 108