日前,在一段代码中调试中,发现对动态分配的内存进行释放时报错,
DAMAGE: after Normal block (#293)at 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字节进入了用户内存区域,只剩余3个FD字节来表示结束。所以,必然导致了free函数内CheckBytes函数检查分配的用户内存空间不正常,导致释放内存失败。
于是,在动态分配内存的时候,多分配了一个类型空间
iarry=(MOBILE_INDEX**)malloc((days+1)*sizeof(MOBILE_INDEX*));
isize=(unsigned long*)malloc((days+1)*sizeof(unsigned long));
试验后,运行正常,内存可以被正确释放,无泄漏。