谈"DAMAGE:after Normal block"的解决方法
在释放内存时,崩溃了,出现了如下错误:
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;
这样就可以避免出现上述的崩溃现象了。