我正在使用c代码编写matlab mex函数。我在释放分配的内存时遇到了一些麻烦。我遇到以下代码的问题。如果我摆脱所有free()行,代码可以工作,但我有内存泄漏。这意味着在内存不足之前代码只能运行几次。所有调用的函数都有指针作为输入,因此我永远不会更改函数内指针的地址。我在内存分配/释放过程中犯了错误吗?
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);
}
答案 0 :(得分:0)
这里有一点 - 你有很多很多的返回语句,你不会在任何这些调用之前释放任何内存。例如,如果invPh为NULL,则不会释放为Ph分配的内存。
答案 1 :(得分:0)
考虑到@Owen说的话,我会将你的malloc
语句放在只执行一次的do-while循环中,并用return
代替所有break
语句。< / p>
do {
// mxMalloc
if (someVar[i] == NULL)
break;
// etc...
// The real meat of your code inside the do-while loop
} while 0 == 1;
// mxFree functions out here
我对编码mex功能有点生疏。这样做可能有更好的做法,但这可能会有所帮助。
您可能还需要检查您尝试释放的每个变量是否为!= NULL
,尽管free
函数可能会自动执行此操作。
编辑:更改了上述代码。我认为@horchler在评论中说得最好:你应该使用mxMalloc
和mxFree
代替malloc
和free
。