谈"DAMAGE:after Normal block"的解决方法
2010-08-02 10:21
267 查看
在释放内存时,崩溃了,出现了如下错误:
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的解决方法
- 关于 DAMAGE:after Normal block(#47) at 0x00000000问题的解决
- Damage :after normal block:
- 关于“Damage:before normal block..."(内存的使用错误)
- 运行时刻错误:DAMAGE: After normal block
- 关于编译器 normal block输出(normal block at 0x0CECA1E8, ** bytes long)内存泄露解决方法
- Debug Error! DAMAGE:after Normal Block (#Xxxx) 问题
- DAMAGE:After normal block
- DAMAGE:After normal block(#****)
- Keil 出现Debug Error! DAMAGE:after Normal block
- DAMAGE:after Normal block问题
- [MFC]关于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的问题
- DAMAGE:after Normal block问题