谈"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;

这样就可以避免出现上述的崩溃现象了。

posted @ 2010-08-02 10:21  y0umer  阅读(823)  评论(0编辑  收藏  举报