1 #include <iostream>
2 #include <list>
3 #include <Windows.h>
4 using namespace std;
5
6 //声明类
7 class myclass;
8
9 struct info
10 {
11 myclass *p;//指针,内存首地址
12 int n;//代表有多少个对象
13 };
14
15 list<info> myclassList;//双链表数据结构管理一个类所有的对象
16
17
18 //类的代码区是共享的,数据是每个对象私有的
19 //空指针调用成员函数,没有访问数据可以调用,访问数据不可以
20 //重载类的new new[] delete delete[] 实现内存管理
21 class myclass
22 {
23 public:
24 void show()
25 {
26 MessageBoxA(0, "hello", "hello", 0);
27 }
28
29 myclass()
30 {
31 cout << "myclass()" << endl;
32 }
33
34 ~myclass()
35 {
36 cout << "~myclass()" << endl;
37 }
38
39 void *operator new(size_t size)
40 {
41 cout << size << endl;
42 void *p = malloc(size);
43 info infonow;
44 infonow.p = (myclass*)p;//分配内存就记录一下
45
46 if(size / sizeof(myclass) == 1)
47 {
48 infonow.n = 1;
49 }
50 else
51 {
52 //为什么要减4因为多了一个指针的内存四个字节
53 infonow.n = (size - 4) / sizeof(myclass);
54 }
55 myclassList.push_back(infonow);//插入链表
56 return p;
57 }
58
59 void operator delete(void *p)
60 {
61 //双链表中检索内存,存在就删除,不存在就不管
62 for (auto ib = myclassList.begin(), ie = myclassList.end(); ib != ie; ib++)
63 {
64 if (p == (*ib).p)
65 {
66 //删除
67 myclassList.erase(ib);
68 free(p);
69 break;
70 }
71 }
72 }
73 void *operator new[](size_t size)
74 {
75 cout << "new[]" << size << endl;
76 return operator new(size);//回调new函数
77 }
78 void operator delete[](void *p)
79 {
80 operator delete(p);
81 }
82 };
83
84 void showmem()
85 {
86 //显示内存
87 for (auto i : myclassList)
88 {
89 cout << "内存地址:" << i.p << " " << "个数:" << i.n << endl;
90 }
91 }
92
93 void showall()
94 {
95 for (auto i : myclassList)
96 {
97 if (i.n == 1)
98 {
99 i.p->show();
100 }
101 else
102 {
103 for (int j = 0; j < i.n; j++)
104 {
105 i.p[j].show();
106 }
107 }
108 }
109 }
110
111 void main()
112 {
113 myclass *p1 = new myclass;
114 /*myclass *p2 = new myclass;
115 myclass *p3 = new myclass;
116 myclass *p4 = new myclass;*/
117 myclass *p5 = new myclass[2];
118 showall();
119 showmem();
120 cout << "-----------------" << endl;
121 delete[] p5;
122 delete p1;
123 showmem();
124 cin.get();
125 }