码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-08-24 18:42:45      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:测试   argv   pen   let   stat   nullptr   对象   通过   name   

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

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

使用很多方法,都避免不了较多的出错分支时,一堆的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(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;
}

 

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

标签:测试   argv   pen   let   stat   nullptr   对象   通过   name   

原文地址:https://www.cnblogs.com/eaglexmw/p/11405424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!