首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态内存分配和内存泄漏

动态内存分配和内存泄漏
EN

Stack Overflow用户
提问于 2013-06-13 09:00:09
回答 2查看 357关注 0票数 0

我正在用c代码编写一个matlab mex函数。我在释放分配的内存时遇到了一些问题。我在使用以下代码时遇到了问题。如果我去掉了所有的free()行,代码就可以工作了,但是我有内存泄漏。这意味着在我耗尽内存之前,代码只工作了几次。所有被调用的函数都有指针作为输入,所以我永远不会改变函数中指针的地址。我是否在内存分配/释放过程中犯了错误?

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

发布于 2013-06-13 09:14:56

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

票数 0
EN

Stack Overflow用户

发布于 2013-06-13 11:36:42

考虑到@Owen所说的,我会将您的malloc语句放在一个只执行一次的do-while循环中,并将您所有的return语句替换为break

代码语言:javascript
复制
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在评论中说得最好:你应该使用mxMallocmxFree,而不是mallocfree

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17077738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档