这是一个小工具,或者小玩意,它作用不大,可以用于不喜欢C++的只能指针的场景。它基于类的构造函数和析构函数原理,利用隐式的调用取释放申请的内存。基于的C++ 版本,c++98
头文件代码
#ifndef _memAutoFree_
#define _memAutoFree_
#include <map>
//
// 一种简单内存管理的玩具类,没什么大的作用,就是在作用域内
// 如果使用它,则它管理的内存都自动释放;在栈中使用如此,全局使用亦如此。
//
//
// 简单的自动回收内存方法
// 不支持引用计数,不支持多线程
// 这里没有考虑效率;因为跨线程的使用,需要生命周期控制还是使用c++中的share_ptr 等吧.
//
class CMemAutoFree
{
public:
//
// 内存类型,一种new 出来的;一种malloc出来的
//
enum
{
MEM_NEW = 1,
MEM_MALLOC = 2
};
CMemAutoFree();
//
// 这里就会自动释放
//
~CMemAutoFree();
//
// 支持C++ 的new
//
template<class T>
T * New()
{
T* p = new T;
if(p)
{
m_mem_list[p]=MEM_NEW;
}
return p;
}
//
// 支持C++的delete
//
template<class T>
void Delete(void* p)
{
if(p)
{
std::map<void*,int>::iterator it= m_mem_list.find(p);
for(;it!=m_mem_list.end();it++)
{
if(it->second == MEM_MALLOC)
{
delete (T*)p;
break;
}
}
}
}
//
// 支持c 语言的malloc
//
void* Malloc(int size);
//
// 支持c 语言的free
//
void* Free(void* p)
{
if(p)
{
std::map<void*,int>::iterator it= m_mem_list.find(p);
for(;it!=m_mem_list.end();it++)
{
if(it->second == MEM_NEW)
{
free(p);
break;
}
}
}
}
private:
std::map<void*,int> m_mem_list;
};
#endif
实现文件
#include "memAutoFree.h"
CMemAutoFree::CMemAutoFree()
{
}
CMemAutoFree::~CMemAutoFree()
{
std::map<void*,int>::iterator it = m_mem_list.begin();
for(;it!=m_mem_list.end();it++)
{
if(it->second == MEM_NEW)
{
delete it->first;
}
else
{
free(it->first);
}
}
m_mem_list.clear();
}
void* CMemAutoFree::Malloc(int size)
{
void* p = malloc(size);
if(p)
{
m_mem_list[p]=MEM_MALLOC;
}
return p;
}
测试代码
//
// 测试在栈中使用
//
void test_mem()
{
CMemAutoFree mem;
std::string *s = mem.New<std::string>();
*s="hello";
//这里可以临时释放
//mem.Delete<std::string>(s);
char* p = (char*)mem.Malloc(100);
memset(p,0,100);
strcpy(p,"hello");
}
//
// 全局的自动内存释放管理
//
CMemAutoFree g_mem;
int main(int argc, _TCHAR* argv[])
{
void * p = g_mem.Malloc(100);
test_mem();
return 0;
}
- 用起来还可以,可以自由的申请啦,而不用擦啦.(这样也不太好,对于培养自己申请,自己释放这个习惯不好。)
|