1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <memory>
11 
12 // shared_ptr
13 
14 // shared_ptr(const shared_ptr& r);
15 
16 #include <memory>
17 #include <cassert>
18 
19 struct A
20 {
21     static int count;
22 
AA23     A() {++count;}
AA24     A(const A&) {++count;}
~AA25     ~A() {--count;}
26 };
27 
28 int A::count = 0;
29 
main()30 int main()
31 {
32     {
33         std::shared_ptr<A> pA(new A);
34         assert(pA.use_count() == 1);
35         assert(A::count == 1);
36         {
37             std::shared_ptr<A> pA2(pA);
38             assert(A::count == 1);
39             assert(pA.use_count() == 2);
40             assert(pA2.use_count() == 2);
41             assert(pA2.get() == pA.get());
42         }
43         assert(pA.use_count() == 1);
44         assert(A::count == 1);
45     }
46     assert(A::count == 0);
47     {
48         std::shared_ptr<A> pA;
49         assert(pA.use_count() == 0);
50         assert(A::count == 0);
51         {
52             std::shared_ptr<A> pA2(pA);
53             assert(A::count == 0);
54             assert(pA.use_count() == 0);
55             assert(pA2.use_count() == 0);
56             assert(pA2.get() == pA.get());
57         }
58         assert(pA.use_count() == 0);
59         assert(A::count == 0);
60     }
61     assert(A::count == 0);
62 }
63