30.双链表管理类的内存释放

  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 }

 

posted @ 2018-03-12 10:33  喵小喵~  阅读(244)  评论(0编辑  收藏  举报