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

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

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

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

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

#include <vector>

classXAutoFreeMem
{
protected:
std::vector
<void*>vec_memorys_;public:
XAutoFreeMem::XAutoFreeMem() {};
virtual XAutoFreeMem::~XAutoFreeMem()
{
//释放对象时,释放管理的内存 for(auto item : vec_memorys_){free(item);
}
}
//通过此接口来申请内存 void* malloc_mem(unsigned intnsize)
{
void* ptr = malloc(nsize);if (nullptr !=ptr) {
vec_memorys_.push_back(ptr);
}
returnptr;
}
};

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

typedef void (*delete_obj_func)(void*);class XAutoFreeObject : publicXAutoFreeMem
{
private:

typedef
structobject_manager_st
{
void*obj_this;
delete_obj_func delete_ptr;
}object_manager_st;
protected:
template
<typename T> static void free_object(T*p_this)
{
deletep_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
= newT;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
= newT(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
= newT;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
= newT(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, intnum)
{
object_manager_st stObjMan;
stObjMan.obj_this
= newT[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, intnum, P param)
{
object_manager_st stObjMan;
stObjMan.obj_this
= newT[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(intnum)
{
object_manager_st stObjMan;
stObjMan.obj_this
= newT[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(intnum, P param)
{
object_manager_st stObjMan;
stObjMan.obj_this
= newT[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;
}

 

标签: none

添加新评论