shared_ptr_move_test.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. #include <boost/shared_ptr.hpp>
  11. #include <boost/detail/lightweight_test.hpp>
  12. #include <utility>
  13. #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
  14. struct X
  15. {
  16. static long instances;
  17. X()
  18. {
  19. ++instances;
  20. }
  21. ~X()
  22. {
  23. --instances;
  24. }
  25. private:
  26. X( X const & );
  27. X & operator=( X const & );
  28. };
  29. long X::instances = 0;
  30. int main()
  31. {
  32. BOOST_TEST( X::instances == 0 );
  33. {
  34. boost::shared_ptr<X> p( new X );
  35. BOOST_TEST( X::instances == 1 );
  36. boost::shared_ptr<X> p2( std::move( p ) );
  37. BOOST_TEST( X::instances == 1 );
  38. BOOST_TEST( p.get() == 0 );
  39. boost::shared_ptr<void> p3( std::move( p2 ) );
  40. BOOST_TEST( X::instances == 1 );
  41. BOOST_TEST( p2.get() == 0 );
  42. p3.reset();
  43. BOOST_TEST( X::instances == 0 );
  44. }
  45. {
  46. boost::shared_ptr<X> p( new X );
  47. BOOST_TEST( X::instances == 1 );
  48. boost::shared_ptr<X> p2;
  49. p2 = std::move( p );
  50. BOOST_TEST( X::instances == 1 );
  51. BOOST_TEST( p.get() == 0 );
  52. boost::shared_ptr<void> p3;
  53. p3 = std::move( p2 );
  54. BOOST_TEST( X::instances == 1 );
  55. BOOST_TEST( p2.get() == 0 );
  56. p3.reset();
  57. BOOST_TEST( X::instances == 0 );
  58. }
  59. {
  60. boost::shared_ptr<X> p( new X );
  61. BOOST_TEST( X::instances == 1 );
  62. boost::shared_ptr<X> p2( new X );
  63. BOOST_TEST( X::instances == 2 );
  64. p2 = std::move( p );
  65. BOOST_TEST( X::instances == 1 );
  66. BOOST_TEST( p.get() == 0 );
  67. boost::shared_ptr<void> p3( new X );
  68. BOOST_TEST( X::instances == 2 );
  69. p3 = std::move( p2 );
  70. BOOST_TEST( X::instances == 1 );
  71. BOOST_TEST( p2.get() == 0 );
  72. p3.reset();
  73. BOOST_TEST( X::instances == 0 );
  74. }
  75. return boost::report_errors();
  76. }
  77. #else // defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
  78. int main()
  79. {
  80. return 0;
  81. }
  82. #endif