DLL内存管理模板类
在DLL中,经常会遇到堆中内存释放的问题,特别是MT(MTd)下的DLL。
本模板类就是对DLL堆中申请的内存进行管理的。
主要功能:
1: 申请堆中内存;
2: 释放内存时,判断传入的内存指针参数是否是本DLL申请的内存;
3: 析构时,对与没有delete的内存自动delete,以免内存泄漏。
主要接口:
1:T* Create(): 在堆中创建对象,并返回指针,该指针已经被管理。
2: bool Release(T* t):释放堆中释放的对象,并解除对指针的管理。
3: ~DllMemeryMng(): 析构函数,释放未释放的堆对象。
代码:
#pragma once
/**
* @defgroup DLL堆管理类
* @brief DLL堆管理类
* @author 徐敏荣
* @date 2012-06-14
*
* @par 修订历史
* @version v0.5 \n
* @author 徐敏荣
* @date 2012-06-14
* @li 初始版本
* @{
*/
#include <vector>
#include <algorithm>
using namespace std;
namespace His
{
/**
* @brief DLL堆管理类
* @note 非线程安全类
*
*/
template<typename T>
class DllMemeryMng
{
public:
/**
* @brief 析构函数,防止内存泄漏。
*/
~DllMemeryMng()
{
for (vector<T*>::iterator it = this->list.begin();
it != this->list.end(); ++it)
{
delete *it;
}
this->list.clear();
}
public:
/**
* @brief 在堆中创建对象,并返回指针,该指针已经被管理。
* @retval 创建对象指针
*/
T* Create()
{
T* t = new T();
list.push_back(t);
return t;
}
/**
* @brief 释放堆中释放的对象,并解除对指针的管理。
* @param[in] t 要释放的指针
* @retval true:成功,false;失败
*/
bool Release(T* t)
{
vector<T*>::iterator it =
find(this->list.begin(), this->list.end(), t);
if (it == list.end())
{
return false;
}
delete *it;
list.erase(it);
return true;
}
private:
vector<T*> list;
};
}
/**//** @}*/ // DLL堆管理类
/**
* @defgroup DLL堆管理类
* @brief DLL堆管理类
* @author 徐敏荣
* @date 2012-06-14
*
* @par 修订历史
* @version v0.5 \n
* @author 徐敏荣
* @date 2012-06-14
* @li 初始版本
* @{
*/
#include <vector>
#include <algorithm>
using namespace std;
namespace His
{
/**
* @brief DLL堆管理类
* @note 非线程安全类
*
*/
template<typename T>
class DllMemeryMng
{
public:
/**
* @brief 析构函数,防止内存泄漏。
*/
~DllMemeryMng()
{
for (vector<T*>::iterator it = this->list.begin();
it != this->list.end(); ++it)
{
delete *it;
}
this->list.clear();
}
public:
/**
* @brief 在堆中创建对象,并返回指针,该指针已经被管理。
* @retval 创建对象指针
*/
T* Create()
{
T* t = new T();
list.push_back(t);
return t;
}
/**
* @brief 释放堆中释放的对象,并解除对指针的管理。
* @param[in] t 要释放的指针
* @retval true:成功,false;失败
*/
bool Release(T* t)
{
vector<T*>::iterator it =
find(this->list.begin(), this->list.end(), t);
if (it == list.end())
{
return false;
}
delete *it;
list.erase(it);
return true;
}
private:
vector<T*> list;
};
}
/**//** @}*/ // DLL堆管理类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?