greenJson_C++_Lib 之五:定义内存回收器

//<Part.五> 内存管理器,负责垃圾内存的回收

//释放基类
class baseReleaser {
protected:
	void* ptr;
public:
	//强制转换
	template<class S>
	operator S* () {
		return (S*)ptr;
	}
	bool isNull() {
		return NULL == ptr;
	}

	virtual ~baseReleaser() {}
	virtual void release() = 0;
};

//自动指针
template<class T>
class autoPointer : public baseReleaser {
private:
	autoPointer(autoPointer& e) {}
	autoPointer& operator = (autoPointer& e) {}

public:
	virtual void release() {
		T* t = (T*)ptr;
		SAFE_DELETE_PTR(t);
		ptr = NULL;
	}

	autoPointer() {
		ptr = NULL;
	}

	autoPointer(const T* t) {
		ptr = (void *)t;
	}

	autoPointer& operator=(const T* t) {
		setPointer(t);
		return *this;
	}

	void setPointer(const T* t) {
		//释放掉之前的旧指针,如果非空的话。
		release();
		ptr = (void*)t;
	}

	//取值
	T& operator*() const {
		assert(ptr);
		return *(T*)ptr;
	}

	//指针
	T* operator->() const {
		return (T*)ptr;
	}

	virtual ~autoPointer() {
		release();
	}
};

//内存管理器
class memoryGarbageCollector {
private:
	autoPointer<map<void*, baseReleaser*> > heapMem;
public:
	template<class T>
	void add(const T * t) {
		if (NULL != t) {
			void* pv = (void*)t;
			//确保同一地址的内存只回收一次垃圾
			if (heapMem->find(pv) == heapMem->end()) {
				baseReleaser* mg = new autoPointer<T>(t);
				(*heapMem)[pv] = mg;
			}
		}
	}

	memoryGarbageCollector() {
		heapMem.setPointer(new map<void*, baseReleaser*>());
	}
		   
	~memoryGarbageCollector() {
		release();
	}

	void release(){
		for (map<void*, baseReleaser*>::iterator it = heapMem->begin(); it != heapMem->end(); ++it) {
			baseReleaser* m = it->second;
			m->release();
			SAFE_DELETE_PTR(m);
		}
		heapMem->clear();
	}
};

因为greenJson中数据位于堆上,所以每个JSON类对象需要独立管理自己的内存,避免内存泄露。这些内存来自于new操作,不管是外部申请的,还是对象自己申请的,只要归对象控制的堆内存,一律放入回收器。

发布了11 篇原创文章 · 获赞 1 · 访问量 302

猜你喜欢

转载自blog.csdn.net/u011697262/article/details/103940797