shared_from_test.cpp 1.8 KB

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