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 XAutoFree : public XAutoFreeMem
{
private:
typedef struct _manager_st{ void* obj_this; delete_obj_func delete_ptr;} _manager_st;protected:
template<typename T>static void free_ (T* p_this){ delete p_this;}template<typename T>static void free_ s(T* p_this){ delete []p_this;}protected:
std::vector< _manager_st> vec_ s_;public:
XAutoFree ::XAutoFree () {};virtual XAutoFree ::~XAutoFree (){ //释放对象时,释放管理的对象 for(auto item : vec_ s_){ (*item.delete_ptr)(item.obj_this); }}//对象//通过此接口来创建对象template<typename T>void new_ (T** ppObj) { _manager_st stObjMan; stObjMan.obj_this = new T; if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr =(delete_obj_func) & free_ <T>; //保存之 vec_ s_.push_back(stObjMan); } *ppObj = (T*)(stObjMan.obj_this); return;}//通过此接口来创建对象template<typename T, typename P>void new_ _with_param(T** ppObj, P param){ _manager_st stObjMan; stObjMan.obj_this = new T(param); if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr = & free_ <T>; //保存之 vec_ s_.push_back(stObjMan); } *ppObj = (T*)(stObjMan.obj_this); return;}//通过此接口来创建对象,这几个接口使用会麻烦一些,使用示例:std::string* pstr = stAutoManager.new_ <std::string> ();template<typename T>T* new_ () { _manager_st stObjMan; stObjMan.obj_this = new T; if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr =(delete_obj_func) & free_ <T>; //保存之 vec_ s_.push_back(stObjMan); } return (T*)(stObjMan.obj_this);}//通过此接口来创建对象template<typename T, typename P>T* new_ _with_param(P param){ _manager_st stObjMan; stObjMan.obj_this = new T(param); if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr = & free_ <T>; //保存之 vec_ s_.push_back(stObjMan); } return (T*)(stObjMan.obj_this);}//对象数组//通过此接口来创建对象数组template<typename T>void new_ s(T** ppObj, int num) { _manager_st stObjMan; stObjMan.obj_this = new T[num]; if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr =(delete_obj_func) & free_ s<T>; //保存之 vec_ s_.push_back(stObjMan); } *ppObj = (T*)(stObjMan.obj_this); return;}//通过此接口来创建对象数组template<typename T, typename P>void new_ s_with_param(T** ppObj, int num, P param){ _manager_st stObjMan; stObjMan.obj_this = new T[num](param); if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr = & free_ <T>; //保存之 vec_ s_.push_back(stObjMan); } *ppObj = (T*)(stObjMan.obj_this); return;}//通过此接口来创建对象数组template<typename T>T* new_ s(int num) { _manager_st stObjMan; stObjMan.obj_this = new T[num]; if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr =(delete_obj_func) & free_ <T>; //保存之 vec_ s_.push_back(stObjMan); } return (T*)(stObjMan.obj_this);}//通过此接口来创建对象数组template<typename T, typename P>T* new_ s_with_param(int num, P param){ _manager_st stObjMan; stObjMan.obj_this = new T[num](param); if (nullptr != stObjMan.obj_this) { //取得函数指针 stObjMan.delete_ptr = & free_ <T>; //保存之 vec_ s_.push_back(stObjMan); } return (T*)(stObjMan.obj_this);}};
复制代码
调用示例如下:
复制代码
int main(int argc, char* argv[])
{
//cwSL3D_test_sum();//测试能否成功调用所有接口XAutoFree stAutoManager;char* strMem = (char*)stAutoManager.malloc_mem(100);std::string* pstr = stAutoManager.new_ <std::string> ();std::string* pstr2 = nullptr;stAutoManager.new_ (&pstr2);{ std::vector<int>* pvec = nullptr; stAutoManager.new_ (&pvec); std::vector<int>* pvec2 = nullptr; stAutoManager.new_ s(&pvec, 2);}return 0; 继续阅读与本文标签相同的文章
上一篇 :
多云协作部署P2P网络的平台化管理畅想
下一篇 :
怎么在百度推广自己的网站?
-
Kafka实战(三) -Kafka的自我修养
2026-05-19栏目: 教程
-
21亿美元,Google叫价两倍收购这家公司,只为硬杠苹果
2026-05-19栏目: 教程
-
SpringBoot 2.0 整合sharding-jdbc中间件,实现数据分库分表
2026-05-19栏目: 教程
-
阿里云独门绝技之“EIP网卡可见模式”
2026-05-19栏目: 教程
-
怎么在百度推广自己的网站?
2026-05-19栏目: 教程
