C++函数中,两个自动释放内存的动态内存申请类

最近做一个事情,实现一个流程交互,其中主交互流程函数中,涉及较多的内存申请,

而健康的函数,都是在函数退出前将手动申请不再需要的内存释放掉,

使用很多方法,都避免不了较多的出错分支时,一堆的if free/delete,代码长而且不好管理

因此,利用C++对象离开作用域会自动调用析构函数的特点,在这儿实现了两个自动释放内存的动态内存申请类

第一个类,只管理内存,不并管理对象

Copy Highlighter-hljs
#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;
}
};

第二个类,能够同时支持内存管理、对象管理

Copy Highlighter-hljs
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);
}
};
posted @   日月王  阅读(1622)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示