我在寫一個使用c代碼的matlab mex函數。我在釋放分配的內存時遇到了一些麻煩。我在遇到以下代碼時遇到問題。如果我擺脫所有的免費()行,代碼的作品,但我有內存泄漏。這意味着代碼在內存不足之前只能運行幾次。所有調用的函數都有指針作爲輸入,所以我從不改變函數內指針的地址。我在內存分配/釋放過程中犯了錯誤嗎?動態內存分配和內存泄漏
void RLS_(int *M, int *N, double *h, double *y, double *P, double *theta)
{
int i;
double *Ph;//[*M];
double hPh;
double inv;
double *inv1;
double *invPh;//[*M];
double *hTtheta;//[*N];
double *ymhTtheta;//[*N];
double **ADD;//[*M][*N];
double **invPhhT;//[*M][*M];
double **SUB;//[*M][*M];
Ph = (double *) malloc (*M * sizeof(double));
if (Ph == NULL)
return;
invPh = (double *) malloc (*M * sizeof(double));
if (invPh == NULL)
return;
hTtheta = (double *) malloc (*N * sizeof(double));
if (hTtheta == NULL)
return;
ymhTtheta = (double *) malloc (*N * sizeof(double));
if (ymhTtheta == NULL)
return;
ADD = (double **) malloc (*M * sizeof(double *));
if (ADD == NULL)
return;
for (i=0;i<*M;i++)
{
ADD[i] = (double *) malloc(*N *sizeof(double));
if (ADD[i] == NULL)
return;
}
invPhhT = (double **) malloc (*M * sizeof(double *));
if (invPhhT == NULL)
return;
for (i=0;i<*M;i++)
{
invPhhT[i] = (double *) malloc(*M *sizeof(double));
if (invPhhT[i] == NULL)
return;
}
SUB = (double **) malloc (*M * sizeof(double *));
if (SUB == NULL)
return;
for (i=0;i<*M;i++)
{
SUB[i] = (double *) malloc(*M *sizeof(double));
if (SUB[i] == NULL)
return;
}
matvectmult_(M,M,P,h,Ph);
hPh = vectordot_(M,h,Ph);
inv = 1/(1+hPh); inv1 =&inv;
scalarmult_(M,inv1,Ph,invPh);
vectmatmult_(M,N,theta,h,hTtheta);
vectorsub_(N,y,hTtheta,ymhTtheta);
vectvectmult_(M,N,invPh,ymhTtheta,*ADD);
vectvectmult_(M,M,invPh,h,*invPhhT);
matmulc_(M,M,M,*invPhhT,P,*SUB);
// Update theta
matrixadd_(M,N,theta,*ADD,theta);
// Update P
matrixsub_(M,M,P,*SUB,P);
free(Ph);
free(invPh);
free(hTtheta);
free(ymhTtheta);
for (i=0;i<*M;i++)
free(ADD[i]);
free(ADD);
for (i=0;i<*M;i++)
free(invPhhT[i]);
free(invPhhT);
for (i=0;i<*M;i++)
free(SUB[i]);
free(SUB);
}
我沒有看到任何MATLAB或MEX相關的東西,這是純粹的C ..也許你可以使用MEX API函數來分配像['mxMalloc'](http://www.mathworks.com/help/matlab/apiref /mxcalloc.html)(它在MEX函數退出時由MATLAB內存管理器自動釋放)。 – Amro
爲什麼不使用'mxMalloc'和'mxFree'?你在使用「mex.h」嗎? – horchler
因爲我不知道那些存在。使用mxMalloc而不是malloc有什麼好處? – user2480446