首页 > 代码库 > c++ simple "Garbage Collector"
c++ simple "Garbage Collector"
The idea is to create a Ptr type that acts like a reference in Java.
And A Garbage Collector (MemMgr) type that acts like a garbage collector in Java.
Just a toy. :D
main.cpp
1 #include "MemMgr.h" 2 3 #include <iostream> 4 5 using namespace std; 6 7 class Box 8 { 9 public:10 void dosomething() { cout << "Box dosomething" << endl; }11 Box() { cout << "Box cons" << endl; }12 ~Box() { cout << "Box des" << endl; }13 };14 15 Ptr<Box> global;16 MemMgr mgr;17 18 19 Ptr<Box> func() {20 Ptr<Box> pb = mgr.regist(new Box());21 return pb;22 }23 24 25 26 int main()27 {28 Ptr<Box> p = func();29 p->dosomething();30 (*p).dosomething();31 Ptr<Box> p2 = p;32 p2->dosomething();33 cout << "end of main" << endl;34 global = p2;35 return 0;36 }
MemMgr.h
1 #ifndef MEMMGR_H 2 #define MEMMGR_H 3 4 #include <map> 5 #include <cstdlib> 6 #include <set> 7 8 template <typename TYPE> 9 class Ptr; 10 11 /** 12 MemMgr take the idea of Garbage Collector 13 from the Java language. It‘s just much simple 14 and limited. 15 */ 16 class MemMgr 17 { 18 template <typename T> friend class Ptr; 19 private: 20 typedef unsigned long count; 21 template <typename T> void login(T* ptr_obj); 22 template <typename T> void logout(T* ptr_obj); 23 std::map<void*, count> cmap; 24 public: 25 MemMgr(); 26 /** 27 Client is responsible to ensure obj is in the heap, 28 and make sure only use Ptr objects rather than ordinary 29 pointers when manipulating objects managed by MemMgr. 30 31 If MemMgr is destroyed before any Ptr object managed 32 by it, all Ptr objects managed by that MemMgr are all 33 dangled pointers, this eventually leads to memory leak. 34 So it‘s crucial to make sure MemMgr is not destroyed 35 before ALL Ptr objects managed by it are destroyed. 36 37 Otherwise the behavior of the MemMgr is undefined. 38 */ 39 template <typename T> Ptr<T> regist(T *obj); 40 ~MemMgr(); 41 42 }; 43 44 /** 45 Ptr acts like a reference in java. 46 */ 47 template <typename TYPE> 48 class Ptr { 49 50 friend class MemMgr; 51 52 public: 53 Ptr& operator=(const Ptr<TYPE> ©) 54 { 55 if(copy) { 56 logout(); 57 obj = copy.obj; 58 mgr = copy.mgr; 59 copy.mgr->login(&obj); 60 } // else leaves obj and mgr NULL 61 return *this; 62 } 63 TYPE* operator->() { return obj; } 64 TYPE& operator*() { return *obj; } 65 const TYPE* operator->() const { return obj; } 66 const TYPE& operator*() const { return *obj; } 67 operator bool() const { return ( (obj != NULL) && (mgr != NULL) ); } 68 69 Ptr(): obj(NULL), mgr(NULL) {} 70 Ptr(const Ptr ©): obj(NULL), mgr(NULL) 71 { 72 if(copy) { 73 obj = copy.obj; 74 mgr = copy.mgr; 75 copy.mgr->login(obj); 76 } 77 } 78 ~Ptr() 79 { 80 logout(); 81 } 82 private: 83 Ptr(TYPE *_obj, MemMgr *_mgr): obj(_obj), mgr(_mgr) 84 { 85 mgr->login(obj); 86 } 87 void logout() { 88 if (*this) { 89 mgr->logout(obj); obj = NULL; mgr = NULL; 90 } 91 } 92 TYPE *obj; 93 MemMgr *mgr; 94 }; 95 96 97 template <typename T> Ptr<T> MemMgr::regist(T *obj) 98 { 99 return Ptr<T>(obj, this);100 }101 102 template <typename T>103 void MemMgr::login(T* ptr_obj)104 {105 std::map<void*, count>::iterator iter = cmap.find(ptr_obj);106 if (iter != cmap.end()) {107 ++(iter->second);108 } else {109 cmap.insert(std::pair<void*, count>(ptr_obj, 1));110 }111 }112 113 template <typename T>114 void MemMgr::logout(T* ptr_obj)115 {116 std::map<void*, count>::iterator iter = cmap.find(ptr_obj);117 if (iter != cmap.end()) {118 --(iter->second);119 if (iter->second == 0) {120 T *p = (T*)(iter->first);121 delete p;122 }123 }124 }125 126 #endif // MEMMGR_H
MemMgr.cpp
1 #include "MemMgr.h" 2 3 #include <iostream> 4 5 using namespace std; 6 7 MemMgr::MemMgr() 8 { 9 cout << "MemMgr cons" << endl;10 }11 12 MemMgr::~MemMgr()13 {14 cout << "MemMgr des" << endl;15 }
c++ simple "Garbage Collector"
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。