zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Alpha冲刺Day10
    Alpha冲刺Day9
    Alpha冲刺Day8
    Alpha冲刺Day7
    Alpha冲刺Day6
    SDN
    【Alpha
    【Alpha】团队课程展示
    【Alpha】团队项目测试报告与用户反馈
    【Alpha】总结
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8547895.html
Copyright © 2011-2022 走看看