blob: 7ae7e718df3c249bcc7f787295123e628f1a948a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#include "shared_ptr.hpp"
#include <iostream>
#include <memory>
#include <string>
class MyClass
{
public:
MyClass() = default;
MyClass(std::string name) :
m_name(name) {}
MyClass(std::string name, unsigned int rank) :
m_name(name), m_rank(rank) {}
MyClass(unsigned int rank, int) :
// Not giving the second parameter a name to prevent a compiler warning
m_rank(rank)
{
}
void showMessage(std::string msg) { std::cout << msg << std::endl; }
std::string m_name = "anonymous";
unsigned int m_rank = 0;
};
void demoSharedPointer();
// ------------------------------------------------------------------
//
// Shared memory assignment: usu::shared_ptr usu::unique_ptr
//
// ------------------------------------------------------------------
int main()
{
demoSharedPointer();
return 0;
}
void demoSharedPointer()
{
std::shared_ptr<int> p1 = std::make_shared<int>();
usu::shared_ptr<int> p2 = usu::make_shared<int>();
usu::shared_ptr<std::string> p2a = usu::make_shared<std::string>();
std::shared_ptr<int> p3 = std::make_shared<int>(10);
usu::shared_ptr<int> p4 = usu::make_shared<int>(10);
std::shared_ptr<std::string> p5 = std::make_shared<std::string>();
usu::shared_ptr<std::string> p6 = usu::make_shared<std::string>();
usu::shared_ptr<std::string> p6b = usu::make_shared<std::string>("Hi Mom!");
std::shared_ptr<MyClass> p7 = std::make_shared<MyClass>();
usu::shared_ptr<MyClass> p8 = usu::make_shared<MyClass>();
std::shared_ptr<MyClass> p9 = std::make_shared<MyClass>("Test");
usu::shared_ptr<MyClass> p10 = usu::make_shared<MyClass>("Test");
std::shared_ptr<MyClass> p11 = std::make_shared<MyClass>("Test", 2);
usu::shared_ptr<MyClass> p12 = usu::make_shared<MyClass>("Test", 2);
std::shared_ptr<MyClass> p13 = std::make_shared<MyClass>(1, 2);
usu::shared_ptr<MyClass> p14 = usu::make_shared<MyClass>(1, 2);
std::cout << std::endl;
std::cout << "--- Reference Counts ---" << std::endl;
std::cout << "p13 : " << p13.use_count() << std::endl;
std::cout << "P14 : " << p14.use_count() << std::endl;
auto p13b = p13;
auto p14b = p14;
std::cout << "auto p13b = p13" << std::endl;
std::cout << "auto p14b = p14" << std::endl;
std::cout << "p13 : " << p13.use_count() << std::endl;
std::cout << "P14 : " << p14.use_count() << std::endl;
p13b = p11;
p14b = p12;
std::cout << "auto p13b = p11" << std::endl;
std::cout << "auto p14b = p12" << std::endl;
std::cout << "p11 : " << p11.use_count() << std::endl;
std::cout << "P12 : " << p12.use_count() << std::endl;
std::cout << "p13b : " << p13b.use_count() << std::endl;
std::cout << "P14b : " << p14b.use_count() << std::endl;
std::cout << "p13 : " << p13.use_count() << std::endl;
std::cout << "P14 : " << p14.use_count() << std::endl;
std::cout << std::endl;
std::cout << "--- Member Access ---" << std::endl;
p13->showMessage("from p13");
p14->showMessage("from p14");
(*p13).showMessage("from (*p13)");
(*p14).showMessage("from (*p14)");
MyClass* x = p13.get();
x->showMessage("from p13.get()");
MyClass* y = p14.get();
y->showMessage("from p14.get()");
usu::shared_ptr<MyClass[]> a1 = usu::make_shared_array<MyClass, 4>();
for (unsigned int i = 0; i < a1.size(); i++)
{
a1[i].showMessage("this is a test");
}
}
|