也谈 释放动态分配的内存的时候出现的异常

日前,在一段代码中调试中,发现对动态分配的内存进行释放时报错,

DAMAGE: after Normal block #293at 0x002b23ed

代码大体如下:

…………………

         {

                   iarry=(MOBILE_INDEX**)malloc(days*sizeof(MOBILE_INDEX*));

                   isize=(unsigned long*)malloc(days*sizeof(unsigned long));

                   for(int i=0;i<=days;i++)

                   {

                            ……………………….

                            iarry[i]=LoadSuccessMobileIndex(iarry[i],&isize[i],tday,path);

                            size++;

                   }

         }

         FreeArray();

}

void CManMobileDlg::FreeArray()

{

         if(size>0)

         {

                   for(int i=0;i<size;i++)

                   {

                            //if(isize[i]>0)

                                     FreeMobileIndex(iarry[i]);

                            //free(iarry[i]);

                   }

                   free(iarry);

                   free(isize);                  

                   size=0;

         }

}      

大体意思是:先为指针数组动态分配一段空间,然后在循环内为每个指针数组元素分配内存空间,然后在操作完成后,通过自定义函数释放这些内存空间。

 

跟了好几次,百思不得其解,就GOOGLE一下,在VCKBASE.COM 找到了一篇文章,http://www.vckbase.com/document/finddoc.asp?keyword=%C9%FA%CB%C0%BD%AE%BD%E7 ,大受起码,也咬牙跟进了free函数内部。

的确,内存分配完毕后,内存分配机制会在分配的内存空间后部添加四个FD字节,以表示以上为用户的内存区域。

仔细比对了自己的内存区域,发现在四个FD字节之前,自己分配的内存空间竟然没有对齐,导致了有一个FD字节进入了用户内存区域,只剩余3FD字节来表示结束。所以,必然导致了free函数内CheckBytes函数检查分配的用户内存空间不正常,导致释放内存失败。

于是,在动态分配内存的时候,多分配了一个类型空间

iarry=(MOBILE_INDEX**)malloc((days+1)*sizeof(MOBILE_INDEX*));

isize=(unsigned long*)malloc((days+1)*sizeof(unsigned long));

试验后,运行正常,内存可以被正确释放,无泄漏。

 

你可能感兴趣的:(c,Google,mobile,Path)