首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于释放内存时出现_CrtIsValidHeapPointer(pUserData)异常

2013-12-15 
关于释放内存时出现_CrtIsValidHeapPointer(pUserData)错误很平常的申请内存,释放内存。却出现_CrtIsValidH

关于释放内存时出现_CrtIsValidHeapPointer(pUserData)错误
很平常的申请内存,释放内存。
却出现_CrtIsValidHeapPointer(pUserData)错误。
一个头文件中的函数如下,在主函数中调用。。。实在想不明白。
网上查了部分资料,
http://blog.sina.com.cn/s/blog_5119a7f90100yeqm.html
DLL堆的内存在exe的堆中释放,会访问不到。可是我特么明明是在一个堆中中申请和释放的。
还有用共享方式链接C运行时库。可是这个怎么弄呢,所以求助大家。
或者看看是不是别的原因,开始用new delete也不对,malloc和free也不对。
求助高手,高手要我试试GlobalAlloc等win api。可是那不是16位操作系统的么,不适合win32。
急切求助大家。
乱试了几下后,现在出现这个错误
关于释放内存时出现_CrtIsValidHeapPointer(pUserData)异常

int Dynamic_Programming_about_this(string A , string B)
{
int LenA = A.length();
int LenB = B.length();

int i , j;
//定义一个矩阵,开辟空间
//int **cost_matrix = new int*[LenA + 1];
int **cost_matrix = (int**)malloc(LenA + 1);
//HGLOBAL cost_matrix = GlobalAlloc(GHND , LenA + 1);
for(i = 0;i < LenA + 1;++ i)
cost_matrix[i] = (int*)malloc(LenB + 1);



//先初始化矩阵的第一行和第一列。
for(i = 0;i < LenA + 1; ++ i)
cost_matrix[0][i] = i;
for(i = 0;i < LenA + 1; ++ i)
cost_matrix[i][0] = i;

//开始计算,将值填在矩阵中对应的位置
int F_ij;//对应坐标(i , j)处相等与否
for(i = 1;i < LenA + 1; ++ i)
{
for(j = 1;j < LenB + 1; ++ j)
{
F_ij = 0;
if(A[i] != B[j])
F_ij = 1;
cost_matrix[i][j] = 
getMinValue(cost_matrix[i - 1][j] + 1, cost_matrix[i][j - 1] + 1, cost_matrix[i - 1][j - 1] + F_ij);
}
}

//输出矩阵
cout << "*****************************" << endl;
cout << "字符串编辑距离矩阵如下:" << endl;
for(i = -1;i < LenA + 1; ++ i)
{
for(j = -1;j < LenB + 1; ++ j)
{
cout.width(3);
              if (i ==-1 && j == -1)
              {
                  cout << " ";
              }
              else if (i + j == -1)
              {
                  cout << "NUL";
              }
  else if (i == -1 && j >0)
              {
                  cout << B[j-1];
              }
              else if(j == -1 && i > 0)
              {
                  cout << A[i-1];
              }
              else
              {
                  cout << cost_matrix[i][j];
              }
}
printf_s("\n");
}
printf_s("\n");
int edits = cost_matrix[LenA][LenB];
//释放内存--dll方法调用引发的CrtIsValidHeapPointer错误!!!还需解决。
for(i = 0;i < LenA + 1;i ++)
{
//delete []cost_matrix[i];
free(cost_matrix[i]);
//cost_matrix[i] = NULL;
}
free(cost_matrix);
//delete []cost_matrix;
//delete_memory(cost_matrix , LenA , LenB);
return edits;
}


[解决办法]
一看就是越界访问了, 导致堆被破坏.

 for(i = 0;i < LenA + 1; ++ i)
        cost_matrix[0][i] = i;  这里第二维明显应该是LenB, 你却在以lenA访问.

其它地方暂时没看出来, 慢慢查.

[解决办法]
1)
//先初始化矩阵的第一行和第一列。
    for(i = 0;i < LenA + 1; ++ i)
        cost_matrix[0][i] = i;
    //for(i = 0;i < LenA + 1; ++ i)//LenA改成LenB,你这是矩阵,不是方阵。
    for(i = 0;i < LenB + 1; ++ i)
        cost_matrix[i][0] = i;

[解决办法]
int ** matrix = 0;
matrix = new int[lenA];
for(int i=0; i<lenA; i++)
{
    matrix[i] = new int[lenB];
}


for(int i=0; i<lenA; i++)
{
    delete [] matrix[i];
}
delete []matrix;

热点排行