C++函数中,两个自动释放内存的动态内存申请类
C++函数中,两个自动释放内存的动态内存申请类
最近做一个事情,实现一个流程交互,其中主交互流程函数中,涉及较多的内存申请,
而健康的函数,都是在函数退出前将手动申请不再需要的内存释放掉,
使用很多方法,都避免不了较多的出错分支时,一堆的if free/delete,代码长而且不好管理
因此,利用C++对象离开作用域会自动调用析构函数的特点,在这儿实现了两个自动释放内存的动态内存申请类
第一个类,只管理内存,不并管理对象
复制代码
include
class XAutoFreeMem
{
protected:
std::vector<void*> vec_memorys_;
public:
XAutoFreeMem::XAutoFreeMem() {}; virtual XAutoFreeMem::~XAutoFreeMem() { //释放对象时,释放管理的内存 for(auto item : vec_memorys_){ free(item); } } //通过此接口来申请内存 void* malloc_mem(unsigned int nsize) { void* ptr = malloc(nsize); if (nullptr != ptr) { vec_memorys_.push_back(ptr); } return ptr; }
};
复制代码
第二个类,能够同时支持内存管理、对象管理
复制代码
typedef void (delete_obj_func)(void);
class XAutoFreeObject : public XAutoFreeMem
{
private:
typedef struct object_manager_st { void* obj_this; delete_obj_func delete_ptr; }object_manager_st;
protected:
template<typename T> static void free_object(T* p_this) { delete p_this; } template<typename T> static void free_objects(T* p_this) { delete []p_this; }
protected:
std::vector<object_manager_st> vec_objects_;
public:
XAutoFreeObject::XAutoFreeObject() {}; virtual XAutoFreeObject::~XAutoFreeObject() { //释放对象时,释放管理的对象 for(auto item : vec_objects_){ (*item.delete_ptr)(item.obj_this); } } //对象 //通过此接口来创建对象 template<typename T> void new_object(T** ppObj) { object_manager_st stObjMan; stObjMan.obj_this = new T; if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr =(delete_obj_func) & free_object<T>; //保存之 vec_objects_.push_back(stObjMan); } *ppObj = (T*)(stObjMan.obj_this); return; } //通过此接口来创建对象 template<typename T, typename P> void new_object_with_param(T** ppObj, P param) { object_manager_st stObjMan; stObjMan.obj_this = new T(param); if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr = & free_object<T>; //保存之 vec_objects_.push_back(stObjMan); } *ppObj = (T*)(stObjMan.obj_this); return; } //通过此接口来创建对象,这几个接口使用会麻烦一些,使用示例:std::string* pstr = stAutoManager.new_object<std::string> (); template<typename T> T* new_object() { object_manager_st stObjMan; stObjMan.obj_this = new T; if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr =(delete_obj_func) & free_object<T>; //保存之 vec_objects_.push_back(stObjMan); } return (T*)(stObjMan.obj_this); } //通过此接口来创建对象 template<typename T, typename P> T* new_object_with_param(P param) { object_manager_st stObjMan; stObjMan.obj_this = new T(param); if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr = & free_object<T>; //保存之 vec_objects_.push_back(stObjMan); } return (T*)(stObjMan.obj_this); } //对象数组 //通过此接口来创建对象数组 template<typename T> void new_objects(T** ppObj, int num) { object_manager_st stObjMan; stObjMan.obj_this = new T[num]; if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr =(delete_obj_func) & free_objects<T>; //保存之 vec_objects_.push_back(stObjMan); } *ppObj = (T*)(stObjMan.obj_this); return; } //通过此接口来创建对象数组 template<typename T, typename P> void new_objects_with_param(T** ppObj, int num, P param) { object_manager_st stObjMan; stObjMan.obj_this = new T[num](param); if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr = & free_object<T>; //保存之 vec_objects_.push_back(stObjMan); } *ppObj = (T*)(stObjMan.obj_this); return; } //通过此接口来创建对象数组 template<typename T> T* new_objects(int num) { object_manager_st stObjMan; stObjMan.obj_this = new T[num]; if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr =(delete_obj_func) & free_object<T>; //保存之 vec_objects_.push_back(stObjMan); } return (T*)(stObjMan.obj_this); } //通过此接口来创建对象数组 template<typename T, typename P> T* new_objects_with_param(int num, P param) { object_manager_st stObjMan; stObjMan.obj_this = new T[num](param); if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr = & free_object<T>; //保存之 vec_objects_.push_back(stObjMan); } return (T*)(stObjMan.obj_this); }
};
复制代码
调用示例如下:
复制代码
int main(int argc, char* argv[])
{
//cwSL3D_test_sum();//测试能否成功调用所有接口 XAutoFreeObject stAutoManager; char* strMem = (char*)stAutoManager.malloc_mem(100); std::string* pstr = stAutoManager.new_object<std::string> (); std::string* pstr2 = nullptr; stAutoManager.new_object(&pstr2); { std::vector<int>* pvec = nullptr; stAutoManager.new_object(&pvec); std::vector<int>* pvec2 = nullptr; stAutoManager.new_objects(&pvec, 2); } return 0;
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
.net必问的面试题系列之基本概念和语法
.net必问的面试题系列之基本概念和语法上个月离职了,这几天整理了一些常见的面试题,整理成一个系列给大家分享一下,机会是给有准备的人,面试造火箭,工作拧螺丝,不慌,共勉。1.net必问的面试题系列之基本概念和语法2.net必问的面试题系列之面向对象3.net必问的面试题系列之设计模式4.net必问的面试题系列之集合、异常、泛型5.net必问的面试题系列之简单算法6.net必问的面试题系列之数据库7.net必问的面试题系列之web前端 字符串中string str=null和string str=""的区别 str="" ,初始化对象,并分配一个空字符串的内存空间 string str=null,初始化对象,不会分配内存空间 byte b = 'a'; byte c = 1; byte d = 'ab'; byte e = '啊'; byte g = 256; 这些变量有些错误是错再哪里? 本题考查的是数据类型能承载数据的大小。 b 1byte =8bit,1个汉字=2个byte,1个英文=1个byte=8bitc 所以bc是对的,deg是错的。'a'是char类型,a错误d java ...
- 下一篇
Java多线程-程序运行堆栈分析
class文件内容 class文件包含JAVA程序执行的字节码;数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符;文件开头有一个0xcafebabe(16进制)特殊的一个标志。 JVM运行时数据区 线程独占:每个线程都会有它独立的空间,随线程生命周期而创建和销毁线程共享:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁 方法区 JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据。虚拟机规范中这是一个逻辑区划。具体实现根据不同虚拟机来实现。如:oracle的HotSpot在java7中方法区放在永久代,java8放在元数据空间,并且通过GC机制对这个区域进行管理 堆内存 堆内存还可以细分为:老年代、新生代(Eden、From Survivor、To Survivor)JVM启动时创建,存放对象的实例。垃圾回收器主要就是管理堆内存。如果满了,就会出现OutOfMemoryError。 虚拟机栈 虚拟机栈,每个线程都在这个空间有一个私有的空间。线程栈由多个栈帧(Stack Frame)组成。一个线程会执行一个或多个方法,一个方法对应一个栈帧。栈帧内容...
相关文章
文章评论
共有0条评论来说两句吧...