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
15class X
16{
17private:
18
19 int m_;
20
21public:
22
23 X(): m_() {}
24};
25
26class Y: public boost::enable_shared_from
27{
28};
29
30class Z: public X, public Y
31{
32public:
33
34 boost::shared_ptr<Z> shared_from_this()
35 {
36 return boost::shared_from( p: this );
37 }
38};
39
40void null_deleter( void const* )
41{
42}
43
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

source code of boost/libs/smart_ptr/test/shared_from_test.cpp