gpt4 book ai didi

c - 动态内存分配和内存泄漏

转载 作者:行者123 更新时间:2023-11-30 17:50:44 24 4
gpt4 key购买 nike

我正在使用 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);
}

最佳答案

这里有一点 - 你有很多很多 return 语句,并且在任何这些调用之前你都不会释放任何内存。例如,如果 invPh 为 NULL,则不会释放为 Ph 分配的内存。

关于c - 动态内存分配和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17077738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com