![]() |
|
||||||||||||||
| | 网站首页 | 数据库教程 | web编程 | 服务器 | 程序设计 | | ||
|
||
|
||||||
| 也谈 释放动态分配的内存的时候出现的异常 | ||||||
作者:佚名 文章来源:不详 点击数: 更新时间:2007-9-12 ![]() |
||||||
|
日前,在一段代码中调试中,发现对动态分配的内存进行释放时报错, 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)); 试验后,运行正常,内存可以被正确释放,无泄漏。 本文来源:http://blog.csdn.net/jackyvan/archive/2007/08/23/1756389.aspx
|
||||||
| 文章录入:admin 责任编辑:admin | ||||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | ||||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 网站地图 | 管理登录 | | |||
|