malloc分配内存失败解决方法
malloc分配内存失败
同一个函数第一次调用,返回结果正确,第二次调用就出现Unhandled Exception......Access Violation访问内存错误了。
有谁知道这是什么原因吗?是这句double** E_inv = (double**)createMatrix(nBand,nBand);类型转换后,E_inv矩阵没有释放内存的原因吗?
------解决思路----------------------
内存是按int[m][n]大小申请的,不要强制转换为double [m][n], 两者并不兼容。
------解决思路----------------------
由此可能引起越界访问,个种问题都可能发生。
------解决思路----------------------
你需要double [m][n],就申请 double[m][n], 不要申请 int[m][n]
同一个函数第一次调用,返回结果正确,第二次调用就出现Unhandled Exception......Access Violation访问内存错误了。
void Classify(BandSet* bandset, double** ClassifyMatrix)
{
......
double dPlants = Mahalanobis(Plants_Avg,Plants_Cov,Plants_Pw,x);//第一次调用,返回结果正确
double dWater = Mahalanobis(Water_Avg,Water_Cov,Water_Pw,x); //第二次调用出错
......
}
//计算马氏距离
double Mahalanobis(double* avg, double** cov, double Pw, double* x)
{
int i,j;
double d = 0;
double sum = 0;
//计算协方差的逆阵
double** E_inv = (double**)createMatrix(nBand,nBand); //出错时,调试定位到这里
E_inv = MatrixInverse(cov,nBand);
//计算三个矩阵的内积,得到第一项item1
double temp[nBand] = {0.0};
for (i=0;i<nBand;i++)
{
for (j=0;j<nBand;j++)
{
sum += (x[j]-avg[j])*E_inv[i][j];
}
temp[i] = sum;
}
double item1 = 0;
for (i=0;i<nBand;i++)
{
item1 += temp[i]*(x[i]-avg[i]);
}
item1 = item1 * (-0.5);
//freeMatrix(E_inv,nBand,nBand);
//计算第二项item2
double item2 = log(Det(cov,nBand));
item2 = item2 * (-0.5);
//计算第三项item3
double item3 = log(Pw);
//计算最终的马氏距离d
d = item1 + item2 + item3;
return d;
}
//创建一个m行n列的矩阵
int** createMatrix(int m, int n)
{
int** Matrix;
int i;
Matrix = (int **) malloc(sizeof(int *) * m);
for(i = 0; i < m; i++)
{
Matrix[i] = (int *) malloc(sizeof(int) * n);//进一步调试,错误定位到这里
}
return Matrix;
}
有谁知道这是什么原因吗?是这句double** E_inv = (double**)createMatrix(nBand,nBand);类型转换后,E_inv矩阵没有释放内存的原因吗?
------解决思路----------------------
内存是按int[m][n]大小申请的,不要强制转换为double [m][n], 两者并不兼容。
------解决思路----------------------
由此可能引起越界访问,个种问题都可能发生。
------解决思路----------------------
你需要double [m][n],就申请 double[m][n], 不要申请 int[m][n]