C++函数中,两个自动释放内存的动态内存申请类
最近做一个事情,实现一个流程交互,其中主交互流程函数中,涉及较多的内存申请,
而健康的函数,都是在函数退出前将手动申请不再需要的内存释放掉,
使用很多方法,都避免不了较多的出错分支时,一堆的if free/delete,代码长而且不好管理
因此,利用C++对象离开作用域会自动调用析构函数的特点,在这儿实现了两个自动释放内存的动态内存申请类
第一个类,只管理内存,不并管理对象
#include <vector> 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(); 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, );
}
return ;
}
C++函数中,两个自动释放内存的动态内存申请类的更多相关文章
- C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)
C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的 ...
- 【STM32H7教程】第27章 STM32H7的TCM,SRAM等五块内存的动态内存分配实现
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第27章 STM32H7的TCM,SRAM等五块内 ...
- Java静态内存与动态内存分配的解析
1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用 ...
- C之静态内存和动态内存
静态内存: * 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 动态内存: * 程序员自己申请 * new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* ja ...
- SDUT OJ 字典树 AND 静态内存与动态内存
字典树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 遇到单词不认识怎么办? 查字典 ...
- 字符串输出输入函数,const修饰符,内存分区,动态内存管理,指针和函数,结构体
1.字符串输出输入函数 读入字符串的方法: 1) scanf 特点:不能接收空格 2) gets 特点:可以接受含有空格的字符串 ,不安全 3) fgets(); 特点:可以帮我们自动根据数组的长度截 ...
- 深入理解C++中的new/delete和malloc/free动态内存管理
malloc/free和new/delete的区别 malloc/free是C/C++标准库的函数:new/delete是C++操作符. malloc/free只是动态分配内存空间/释放空间:new/ ...
- C++ Primer 5th 第12章 动态内存
练习12.1:在此代码的结尾,b1 和 b2 各包含多少个元素? StrBlob b1; { StrBlob b2 = {"a", "an", "th ...
- iOS内存管理系列之二:自动释放与便捷方法
有时候一个所有者创建一个对象后,会立刻将该对象的指针传递给其它所有者.这时,这个创建者不希望再拥有这个对象,但如果立刻给它发送一个release消息会导致这个对象被立刻释放掉——这样其它所有者还没有来 ...
随机推荐
- seleniumGrid分布式远程执行测试脚本
执行UI自动化测试脚本时,不仅可以在本地执行,也可以远程指定某计算机执行测试脚本,seleniumGrid为我们提供了这类服务,但还需要自己搭建环境. 一.本地计算机需要准备java环境和seleni ...
- vs断点命不中?
用管理员权限打开vs,再打开工程即可
- 个人永久性免费-Excel催化剂功能第18波-在Excel上也能玩上词云图
这年头数据可视化日新月异,在Excel上做数据分析,最后一步,难免要搞个图表输出高大上一回,微软也深知此道,在Excel2016上更新了一大波图表功能,市场上很耀眼的词云图还是没加进来,虽然在各大的在 ...
- Hyperledger Fabric 之 Channel ,创建channel链接几项注意点
好长时间没有更新博客,网上也有很多fabric的部署资料,而且也都很不错,也比较全面.我就再想重复的工作暂时就不用做了,后面抽时间在做细化和分类:就将学习和工作中遇到和解决的问题经验,做一些分享. 而 ...
- C语言编程入门之--第一章初识程序
第一章 初识程序 导读:计算机程序无时不刻的影响着人类的生活,现代社会已经离不开程序,程序的作用如此巨大,那么程序到底是什么呢?本章主要讨论程序的概念,唤起读者对程序的兴趣,同时对C语言程序与其它语言 ...
- Spring:IOC本质分析探究
IOC本质分析 分析实现 我们先用我们原来的方式写一段代码 . 先写一个UserDao接口 public interface UserDao { public void getUser(); } 再去 ...
- Sting和Long类型转换
java String 转 Long 两种方法区别Long.ValueOf("String")返回Long包装类型包装类型: Byte,Integer,Short,Long,Boo ...
- 嵌套&匿名&高阶函数
嵌套&匿名&高阶函数 嵌套函数 函数可以嵌套定义并调用函数 name = "小明" def change(): name = "小明,你好" d ...
- 通过OpenGL理解前端渲染原理(1)
一.OpenGL OpenGL,是一套绘制3D图形的API,当然它也可以用来绘制2D的物体.OpenGL有一大套可以用来操作模型和图片的函数,通常编写OpenGL库的人是显卡的制造者.我们买的显卡都支 ...
- Python3的日志添加功能
python日志添加功能,主要记录程序运行中的日志,统一收集并分析 一.日志的级别 debug(调试信息) info() warning(警告信息)error(错误信息) critical(致命信息) ...