30.雙鏈表管理類的內存釋放
阿新 • • 發佈:2018-03-12
hello 表數據 back 共享 erase 釋放 post 顯示 聲明
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 }
30.雙鏈表管理類的內存釋放