1+ // cppcheck-suppress-file [functionConst]
2+
3+ // Overloading operator new, delete
4+ // Debug
5+
6+ #include < iostream>
7+ #include " ExampleRegistry.h"
8+ namespace {
9+
10+ class IntCollection {
11+ private:
12+ int m_data[3 ]{10 , 20 , 30 };
13+
14+ public:
15+ class Iterator {
16+ private:
17+ int * m_ptr;
18+
19+ public:
20+ explicit Iterator (int * ptr) : m_ptr(ptr) {}
21+
22+ int & operator *() { return *m_ptr; }
23+
24+ int * operator ->() { return m_ptr; }
25+
26+ Iterator& operator ++() {
27+ ++m_ptr;
28+ return *this ;
29+ }
30+
31+ bool operator !=(const Iterator& other) const {
32+ return m_ptr != other.m_ptr ;
33+ }
34+ };
35+
36+ Iterator begin () { return Iterator (m_data); }
37+ Iterator end () { return Iterator (m_data + 3 ); }
38+
39+ // int* a = new int;
40+ void * operator new (size_t size) {
41+ std::cout << " void* operator new(size_t size)\n " ;
42+ // void* p = ::operator new(size);
43+ void * p = malloc (size);
44+ if (!p)
45+ throw std::bad_alloc ();
46+ return p;
47+ }
48+
49+ // delete a
50+ void operator delete (void * p) {
51+ std::cout << " void operator delete(void* p)\n " ;
52+ free (p);
53+ }
54+
55+ // int* as = new int[100]
56+ void * operator new [](size_t size) {
57+ std::cout << " void* operator new[](size_t size)\n " ;
58+ void * p = malloc (size);
59+ if (!p)
60+ throw std::bad_alloc ();
61+ return p;
62+ }
63+
64+ // delete []as;
65+ void operator delete[] (void * p) {
66+ std::cout << " void operator delete[](void* p)\n " ;
67+ free (p);
68+ }
69+ };
70+
71+ void run () {
72+ IntCollection* col = new IntCollection;
73+
74+ for (auto it = col->begin (); it != col->end (); ++it) {
75+ std::cout << *it << ' \n ' ;
76+ }
77+
78+ delete col;
79+
80+ IntCollection* cols = new IntCollection[10 ];
81+ for (int i = 0 ; i < 10 ; ++i) {
82+ for (auto it = cols[i].begin (); it != cols[i].end (); ++it) {
83+ std::cout << *it << ' \n ' ;
84+ }
85+ }
86+ delete[] cols;
87+ }
88+ } // namespace
89+
90+ class AllocationOperator : public IExample {
91+ public:
92+ std::string group () const override { return " core/overloading" ; }
93+ std::string name () const override { return " AllocationOperator" ; }
94+ std::string description () const override { return " " ; }
95+
96+ void execute () override { run (); }
97+ };
98+
99+ REGISTER_EXAMPLE (AllocationOperator, " core/overloading" , " AllocationOperator" );
0 commit comments