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消息会导致这个对象被立刻释放掉——这样其它所有者还没有来 ...
随机推荐
- nuxt项目打包上线,以及nuxt项目基础代码分享
nuxt的项目部署到线上环境,有多种方法,这里分享我使用的方法,一步步照着配置,就可以配置成功~ (1)项目先执行npm run build 打包好 (2)服务器安装node 和pm2依赖 服务器 ...
- go 学习笔记之初识 go 语言
Go 是一种开源编程语言,可以轻松构建简单,可靠,高效的软件. 摘录自 github: https://github.com/golang/go,其中官网(国外): https://golang.or ...
- Excel催化剂开源第40波-Excel插入图片做到极致的效果
不知道是开发人员的自我要求不高还是用户的使用宽容度足够大,在众多Excel插入图片的版本中,都没有考虑到许多的可大幅度提升用户体验的细节处理. Excel催化剂虽然开发水平有限,但也在有限的能力下,尽 ...
- HIVE之 DDL 数据定义 & DML数据操作
DDL数据库定义 创建数据库 1)创建一个数据库,数据库在 HDFS 上的默认存储路径是/user/hive/warehouse/*.db. hive (default)> create dat ...
- 使用c++开发跨平台的程序
使用c++开发跨平台的程序 背景 在开发过程中,使用c++作为开发语言,通常被认为是痛苦的,啰嗦的,超长开发时间的.最近几年有各种各样的语言被广泛使用,相对比来说c++不是那么出彩.c++虽然年龄大, ...
- 50 行 Python 代码,带你追到女神
今天来给大家分享一个撩妹技巧,利用 python 每天给你最心爱的人,发送微信消息,说声晚安. 废话不多说,源代码奉上 def get_news(): ... url = "http://o ...
- linux初学者-sshd服务
linux初学者-sshd服务 在linux系统操作中,经常需要连接其他的主机,连接其他主机的服务是openssh-server,它的功能是让远程主机可以通过网络访问sshd服务,开始一个安全s ...
- 【iOS】libc++abi.dylib: terminate_handler unexpectedly threw an exception
用 ShareSDK 做第三方分享的时候遇到了这个问题…… 联系了客服,后来在他的指导下,发现是数组的问题,该问题不知道是否具有通用性,暂且记下.
- Android Studio 设置/更改 SDK 路径
网上看到有人说需要重启 Android Studio,感觉麻烦,就自己试了试其他方法,果然还是有的! 很简单,只需打开 File 菜单下的 Project Structure 就可以设置了,如图所示:
- powershell小脚本--批量添加用户属性----导出登录时间
需求1:某公司所有员工少了MAIL属性,需要批量添加.例如,用户chenyy 添加邮件属性chenyy@xxxx.com 先导出(只导出名字)备用: Get-ADUser -Filter * -Pr ...