C++ Library Extensions 2022.12.09
To help learn modern C++ programming
040-placement_new.cpp
Go to the documentation of this file.
1#include <iostream>
2#include <new>
3#include <type_traits>
4#include <memory>
5
6constexpr size_t buffer_size = 10;
7
9
11{
12 // int* ptr1 = new ( &gBuffer[0] ) int{10};
13 int* ptr1 = new ( gBuffer + 0 ) int{10};
14
15 std::cout << "*ptr1 = " << *ptr1 << std::endl;
16
17 double* dptr = new (ptr1 + 1) double{3.14};
18
19 std::cout << "*dptr = " << *dptr << std::endl;
20
21 double* dptr2 = new ( dptr + 1 ) double {22.0/7.0};
22
23 std::cout << "*dptr2 = " << *dptr2 << std::endl;
24
25 long long* lptr = new (dptr2 + 1) long long{ 7ull };
26
27 std::cout << "*lptr = " << *lptr << std::endl;
28}
29
31{
32 constexpr size_t element_count = 10;
33
34 int local_buffer[element_count];
35
36 int& a = *new (local_buffer + 0) int {0};
37
38 std::cout <<"a = " << a << std::endl;
39
40 double& d = *new(&a + 1) double {22.0 / 7.0};
41
42 std::cout << "d = " << d << std::endl;
43
44 short& s = *new ( &d + 1) short { 4 };
45
46 std::cout << "s = " << s << std::endl;
47
48}
49
50template<typename Type>
51void placement_delete(Type*& ptr)
52{
53 if constexpr( std::is_class_v<Type> && std::is_destructible_v<Type>)
54 {
55 if(ptr)
56 {
57 ptr->~Type(); // we are calling destructor explicitly
58 ptr = nullptr;
59 }
60 }
61}
62
63class ClsType
64{
65 private:
66 int m_member;
67 public:
68 ClsType(int member = int{}):
69 m_member{ member }
70 {
71 std::cout << "ClsType() called" << std::endl;
72 }
74 {
75 std::cout << "~ClsType() called" << std::endl;
76 }
77
78 friend std::ostream& operator << (std::ostream& os, const ClsType& t)
79 {
80 os << t.m_member;
81 return os;
82 }
83};
84
86{
87 size_t element_count = 10;
88
89 // we are dynamically allocate 10 instance of ClsType
90 std::unique_ptr<char[]> buffer( new char [ element_count * sizeof(ClsType) ] );
91
92 ClsType *ptr1 = new ( buffer.get() ) ClsType{0};
93
94 ClsType *ptr2 = new ( ptr1 + 1 ) ClsType{1};
95
96 std::cout << *ptr1 << std::endl;
97 std::cout << *ptr2 << std::endl;
98
99 placement_delete(ptr1);
100
101 placement_delete(ptr2);
102
103 ptr1 = new (buffer.get() ) ClsType{3};
104
105 std::cout << *ptr1 << std::endl;
106
107 placement_delete(ptr1);
108
109 // the point is that
110 // don't do delete ptr1, or delete ptr2
111}
112
113int main()
114{
115 // test_placement_new_operator();
116
117 // placement_new_using_local_stack_buffer();
118
120}
void placement_delete(Type *&ptr)
int gBuffer[buffer_size]
void advanced_placement_new_delete()
void test_placement_new_operator()
constexpr size_t buffer_size
void placement_new_using_local_stack_buffer()
int main()
auto & cout
auto & endl
friend std::ostream & operator<<(std::ostream &os, const ClsType &t)
move_type_t m_member
Definition: 068-move.cpp:11
ClsType(int member=int{})