应用模板类解决临时内存的释放问题
来源:互联网 发布:东华软件股吧 编辑:程序博客网 时间:2024/04/28 16:40
编程的时候经常会遇到这样的问题:由于要分析一段数据,我们需要new一段内存出来做临时内存区域。但是分析的过程比较复杂,后面很多地方都需要终止分析。于是我们只能在每个return前面都加上delete。后面代码维护的时候就非常麻烦,很可能一个疏忽就导致内存块被重复delete(比如原来某个地方需要return,后来加入新规则,就转而进行其他处理。等跳出循环后,忘记了之前统一还有一个delete,然后就悲剧了;或者添加了新的return分支,但是忘记了delete)
有没有什么办法,可以避免这种情况?
答案当然是有!那就是建立一个TempBuf的模板类!
先不废话,上代码:
#pragma oncetemplate<typename T>class TempBuf{public:TempBuf(size_t nSize){//禁止默认构造函数,避免空buf的情况m_Size = 0;m_Buf = new T[nSize+1];if(m_Buf){memset(m_Buf,0,sizeof(T)*(nSize+1));m_Size = nSize;}}~TempBuf(void){//析构empty();}T& operator[](int nIndex){//允许取指定元素,并且防止溢出if(nIndex>m_Size || (nIndex<0)){nIndex = m_Size;//这里还可以加入其他异常处理等等}return m_Buf[nIndex];}operator void*(){//方便memset等函数return (void*)m_Buf;}operator T*(){//允许当成T*指针使用return m_Buf;}size_t size(){//允许获取内存块大小return m_Size;}void empty(){//允许手动清除,但是最好不要使用if(m_Buf){delete[]m_Buf;m_Buf = NULL;}m_Size = 0;}private:T* m_Buf;//分配块地址指针size_t m_Size;//记录了分配块的大小};下面是一段使用的示例:
int fromString( const char* val,size_t len ){if(len<=0 || (val == NULL)){return 0;}size_t i;TempBuf<char> buf(len);//现在,任何时候都可以自由返回,而不必担心内存泄露了memcpy(buf,val,len);
<span style="white-space:pre"></span>RemoveFormatChar(buf,len);for (i=0;i<len;i++){if(buf[i] != 0x20)break;}if(i==len){//所有字符都是格式字符,直接返回空对象return 0;}if(strchr("[{\"",buf[i])){//有子结构//子结构处理……}else{if(buf[i]-'0'<=9){//纯粹是个数字if(error) return -2;}else return -1;//不应该有这样的东西}return 0;}现在,我们就不必再受内存泄露的影响了,维护工作也变得容易了(你可以随时增减分支,而不必担心内存泄露了)
0 0
- 应用模板类解决临时内存的释放问题
- 内存的释放问题
- 解决Firefox内存占用不释放的问题
- 【IOS】cocos2d-x 内存释放问题的解决过程
- 【IOS】cocos2d-x 内存释放问题的解决过程
- hdu 3791(动态内存的释放问题)未解决
- android 退出程序解决内存释放的问题
- android 退出程序解决内存释放的问题
- android 退出程序解决内存释放的问题
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- Dll分配的内存块,应用释放的问题
- 待解决---无名的临时对象,内存到底何时被释放,引用计数是如何控制的
- 如何简化临时内存的分配与释放
- 解密多媒体封装解封装框架
- 1.2 为什么使用 并行
- cookie密码JavaScript
- 揭秘腾讯核心技术:50位专家的纯干货分享
- Unity3d中CharacterController的移动和碰撞分析
- 应用模板类解决临时内存的释放问题
- 看了鸟哥的Linux教程后的一点感受
- 例谈字符串与指针
- 功能性和实用性相结合 打造完美卫生间
- 两种QSlider进度条的QSS样式
- [Hive]简单查询不启用Mapreduce job而启用Fetch task
- Apache Derby Network Server - 10.2.2.0 - (485682) 已启动并且已准备好 2015-04-03 00:55:47.102 GMT 时在端口 1527 上接
- 脚本内访问其他对象,组件或脚本成员方法总结
- httpclient相关文档