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));