谈"DAMAGE:after Normal block"的解决方法
2010-08-02 10:21
204 查看
在释放内存时,崩溃了,出现了如下错误:
User breakpoint called from code at 0x7c921230
Debug Assertion Failed! Program:...
File: dbgheap.c
Line: 1011 Expression: _CrtIsValidHeapPointer(出现问题的指针)
For information on how your program can cause an assertion failure,
see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
如果点击忽略,则继续弹出对话框 Debug Error! Program:...
DAMAGE: after Normal block (#4826967) at 0x2000E148.
(Press Retry to debug the application)
正如上次所述(http://hi.baidu.com/ablenavy/blog/item/6092524e88ff020db2de0516.html
)
(DAMAGE:after Normal block的解决方法)
这次的原因依然是内存申请得太小!
具体代码如下:
#define P2Node_LEN_1 (1024 * 10)
#define P2Node_LEN_2 1024 // Sct_Node是一个结构体
Sct_Node **p2Node; //定义一个指向Sct_Node的指针的指针,相当于二维数组。
// 空间申请
p2Node = (Sct_Node **)malloc(P2Node_LEN_1 * sizeof(Sct_Node *));
for (int i = 0; i < P2Node_LEN_1; i++)
{
p2Node[i] = (Sct_Node *)malloc(P2Node_LEN_2 * sizeof(Sct_Node));
}
// 向p2Node插入数据
pSharedData->p2Node[i][j] = sct_Node; // 释放空间
for ( int i = 0; i < P2Node_LEN_1; i++ )
{
free( p2Node[i] ); //经调试,在该语句中出现崩溃。
}
free( p2Node );
经跟踪程序发现,在向p2Node插入数据时,j的值超过了1024,但可以正常插入,不会出现错误,等释放空间时才出现错误。
解决办法:
将 #define P2Node_LEN_2 1024 改为:
#define P2Node_LEN_2 (1024 * 10)
如何从根本上消除这种错误?!
其实很简单,在插入时加入边界检查,如下:
将插入语句:
pSharedData->p2Node[i][j] = sct_Node;
改为:
if ( j >= P2Node_LEN_2 )
{
cout << "Error! Out of memory! P2Node_LEN_2 is too small"
<< endl;
exit(1);
}
pSharedData->p2Node[i][j] = sct_Node;
这样就可以避免出现上述的崩溃现象了。
User breakpoint called from code at 0x7c921230
Debug Assertion Failed! Program:...
File: dbgheap.c
Line: 1011 Expression: _CrtIsValidHeapPointer(出现问题的指针)
For information on how your program can cause an assertion failure,
see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
如果点击忽略,则继续弹出对话框 Debug Error! Program:...
DAMAGE: after Normal block (#4826967) at 0x2000E148.
(Press Retry to debug the application)
正如上次所述(http://hi.baidu.com/ablenavy/blog/item/6092524e88ff020db2de0516.html
)
(DAMAGE:after Normal block的解决方法)
这次的原因依然是内存申请得太小!
具体代码如下:
#define P2Node_LEN_1 (1024 * 10)
#define P2Node_LEN_2 1024 // Sct_Node是一个结构体
Sct_Node **p2Node; //定义一个指向Sct_Node的指针的指针,相当于二维数组。
// 空间申请
p2Node = (Sct_Node **)malloc(P2Node_LEN_1 * sizeof(Sct_Node *));
for (int i = 0; i < P2Node_LEN_1; i++)
{
p2Node[i] = (Sct_Node *)malloc(P2Node_LEN_2 * sizeof(Sct_Node));
}
// 向p2Node插入数据
pSharedData->p2Node[i][j] = sct_Node; // 释放空间
for ( int i = 0; i < P2Node_LEN_1; i++ )
{
free( p2Node[i] ); //经调试,在该语句中出现崩溃。
}
free( p2Node );
经跟踪程序发现,在向p2Node插入数据时,j的值超过了1024,但可以正常插入,不会出现错误,等释放空间时才出现错误。
解决办法:
将 #define P2Node_LEN_2 1024 改为:
#define P2Node_LEN_2 (1024 * 10)
如何从根本上消除这种错误?!
其实很简单,在插入时加入边界检查,如下:
将插入语句:
pSharedData->p2Node[i][j] = sct_Node;
改为:
if ( j >= P2Node_LEN_2 )
{
cout << "Error! Out of memory! P2Node_LEN_2 is too small"
<< endl;
exit(1);
}
pSharedData->p2Node[i][j] = sct_Node;
这样就可以避免出现上述的崩溃现象了。
相关文章推荐
- "DAMAGE:after Normal block"的解决方法
- 再谈"DAMAGE:after Normal block"的解决方法
- 谈"DAMAGE:after Normal block"的解决方法
- DAMAGE:after Normal block的解决方法
- 如何解决 " HEAP: Free Heap block xxxxxxxx modified at xxxxxxxx after it was freed "
- 关于 DAMAGE:after Normal block(#47) at 0x00000000问题的解决
- 在VMware上编译linux内核出现VFS: Cannot open root device "LABEL=/" or unknown-block(0,0) 错误的解决方法
- 用VirtualBox 安装LFS常见问题的解决方法:“VFS: Unable to mount root device "hda1" or unknown-block(2,0)”
- linux 链接库文件出现“undefined reference to" 问题的解决方法
- win7 IIS7 "另一个程序正在使用此文件,进程无法访问" 解决方法
- MyEclipse打开JSP文件报"Failed to create the part's controls"解决方法汇总
- "undefined reference to" 问题解决方法
- 收藏:Asp.Net 连接Oracle数据库 出现"找不到 Oracle 客户端和网络组件" 彻底解决方法!
- nios系统generate时"Generation skipped because the system has validation errors"j解决方法
- fedora登录gnome出现"failed to load session ‘gnome’”解决方法
- "/bin 不在PATH 环境变量中,故无法找到该命令"的一种解决方法
- "FATAL: Module scsi_wait_scan not found" 解决方法
- Don't know how to iterate over supplied "items" in &lt;forEach&gt;问题的解决方法
- 由于未能创建 Microsoft Visual C# 2008 编译器,因此未能打开项目 "..."的解决方法
- 【Vegas原创】GridView/DataGrid中ToString("yyyy/MM/dd") 不起作用解决方法