C 空闲()期间的堆损坏

C 空闲()期间的堆损坏,c,heap-corruption,C,Heap Corruption,这是调试信息 HEAP[opencv_CoTraining2.exe]: Heap block at 0AD15168 modified at 0AD15594 past requested size of 424 Windows has triggered a breakpoint in opencv_CoTraining2.exe. This may be due to a corruption of the heap, which indicates a bug in opencv_C

这是调试信息

HEAP[opencv_CoTraining2.exe]: Heap block at 0AD15168 modified at 0AD15594 past requested  size of 424
Windows has triggered a breakpoint in opencv_CoTraining2.exe.

This may be due to a corruption of the heap, which indicates a bug in opencv_CoTraining2.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while opencv_CoTraining2.exe has focus.

The output window may have more diagnostic information.
这是我的代码:

void GetKCent(Mat& mat)
{
    double** tmp=(double**)calloc(mat.rows,sizeof(double*));
    double f[128];
    memset(f,0,sizeof(f));
    double max=0;
    for (int i=0;i<mat.rows;i++) 
    {
        tmp[i]=(double*)calloc(mat.cols,sizeof(double));
        for (int j=0;j<mat.cols;j++)
        {
                tmp[i][j]=mat.at<float>(i,j);
                if (tmp[i][j]>max) max=tmp[i][j];
        }
    }
    for (int i=0;i<mat.cols;i++) for (int j=0;j<mat.rows;j++) tmp[j][i]/=max;
    k_means(tmp,mat.rows,128,K_CLUSTER,KMEANSDIS,kcent);
    for (int i=0;i<K_CLUSTER;i++) for (int j=0;j<128;j++) kcent[i][j]*=max;
    for (int i=0;i<mat.rows;i++)free(tmp[i]);
    free(tmp);
}
这是双**kcent

kcent=(double**)calloc(K_CLUSTER,sizeof(double*));
for (int i=0;i<K_CLUSTER;i++) kcent[i]=(double*)calloc(128,sizeof(double));

我认为这一部分是正确的。

您没有在free中使用从calloc获得的指针地址,因此free参数指向的内存起始地址不同。如果我没有错的话,你就不能得到全部的内存,然后把它们分部分释放出来,如果这就是你想要实现的。至少对马洛克来说是这样


免费使用从calloc获得的相同值。

错误消息似乎非常清楚,这是堆损坏

尝试将free for循环移到函数调用k_means上方,并注释掉程序的其余部分

我怀疑这是什么腐蚀堆


如果这个实验正确地释放了内存,您就知道错误在k_means function中…

您正确地调用了这个函数吗?其他一切看起来都很好。k_的意思是换垫子吗?我在没有k_u函数的情况下编译了这个,它与valgrindy一起工作得很好。你忽略了kcent的定义,也许你超出了它的界限?问题可能是在到达空闲位置之前指针的内存损坏。是否遗漏了一些代码,或者f[]是否真的没有使用?请设置调试器的内存窗口,以显示经过损坏行末尾的内存。通过代码的步骤-你将能够很容易地看到内存何时被更改,并将能够锁定罪魁祸首。是的…最后我发现错误在k_means中,并且知道我更正了它…谢谢。。。
int k_means(double **data, int n, int m, int k, double t, double **centroids)
kcent=(double**)calloc(K_CLUSTER,sizeof(double*));
for (int i=0;i<K_CLUSTER;i++) kcent[i]=(double*)calloc(128,sizeof(double));