Expression: _CrtIsValidHeapPointer| Expression:| _CrtIsValidHeapPointer|解决方法|(出现问题的指针)

image

今天调试的时候出现上图问题。原因:使用指针是内存申请得太小,如:

int **g_listData; g_listData = new int *[64];//动态申请存储数据

但是数据有128行,超出了申请如:

g_listData[127]=new int[column];//动态申请

for(i=0;i<column;i++)
{
        g_listData[127][i]=array[i];    //动态存储    
        …    
}

但可以正常插入,不会出现错误,等释放空间时才出现错误

DeleteTem(g_listData,row);

//************************************
////释放分配内存
// FullName:  DeleteTem            释放
// Returns:   void
// Qualifier:
// Parameter: int ** &p            指向指针的指针地址
// Parameter: int row            指针的行数
//************************************
void Data::DeleteTem(int ** &p,int row)
{
    for (int i=0;i<row;i++)
    {
        delete[] p[i]; 
    }
    delete []p; 
}

找到类似的解决方法:

在释放内存时,崩溃了,出现了如下错误:
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)
(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;
这样就可以避免出现上述的崩溃现象了。