0

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

2 に答える 2

0

ここに 1 つのポイントがあります。非常に多くの return ステートメントがあり、これらの呼び出しの前にメモリを解放することはありません。たとえば、invPh が NULL の場合、Ph に割り当てられたメモリは解放されません。

于 2013-06-13T01:14:55.720 に答える