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

简介: C++函数中,两个自动释放内存的动态内存申请类最近做一个事情,实现一个流程交互,其中主交互流程函数中,涉及较多的内存申请,而健康的函数,都是在函数退出前将手动申请不再需要的内存释放掉,使用很多方法,都避免不了较多的出错分支时,一堆的if free/delete,代码长而且不好管理因此,利用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;

}
复制代码
原文地址https://www.cnblogs.com/eaglexmw/p/11405424.html

相关文章
存储 编译器 Linux
13 0
|
1天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
1天前
|
编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
|
1天前
|
存储 编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
|
2天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
2天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
|
11天前
|
存储 算法 C语言
【C++初阶】8. STL初阶 + String类
【C++初阶】8. STL初阶 + String类
47 1
|
21天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
21天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
30 0
|
11天前
|
C语言 C++
【C++初阶】9. string类的模拟实现
【C++初阶】9. string类的模拟实现
36 1