也谈 释放动态分配的内存的时候出现的异常
2007-08-23 17:11
316 查看
日前,在一段代码中调试中,发现对动态分配的内存进行释放时报错,
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));
试验后,运行正常,内存可以被正确释放,无泄漏。
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));
试验后,运行正常,内存可以被正确释放,无泄漏。
相关文章推荐
- 释放动态创建的二维数组时出现内存访问异常
- C/C++动态分配与释放内存的区别详细解析
- C/C++动态分配与释放内存的区别详细解析
- 解析PHP中的内存管理,PHP动态分配和释放内存
- C中的动态内存分配和释放(free)
- C/C++动态分配与释放内存的区别详细解析
- 动态分配多维数组和释放其内存
- 内存动态分配与释放
- 内存的动态分配和释放
- C/C++动态二维数组的内存分配和释放
- 设计一个程序,为二维数组动态的分配内存空间并且释放内存空间;数组元素的赋值结果如下:
- 动态内存分配和释放
- C和C++动态内存分配和释放的区别
- C语言内存动态分配与释放
- c 语言中内存的动态分配(allocate)和释放(free)
- 内存动态分配与释放,malloc和new区别
- 内存动态分配与释放
- C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存
- 动态内存分配与释放(new and delete)
- C/C++动态分配与释放内存的区别详细解析