应用模板类解决临时内存的释放问题

来源:互联网 发布:东华软件股吧 编辑:程序博客网 时间: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
原创粉丝点击