首页 > 解决方案 > 重复分配内存而不释放它

问题描述

下面的代码显示了一个重复分配内存而不首先调用的示例free。相反,它**sign在循环后释放。

#include <stdio.h>
#include <stdlib.h>

float ** fun(int nloc)
{
    float **sign;
    int i,nt=100,it,k;
    sign=(float **)calloc(nloc,sizeof(float *));
    for (i=0;i<nloc;i++)
        sign[i] = (float *)calloc(nt,sizeof(float *));

    for (it=0;it<nt;it++){
        for (k=0;k<nloc;k++){
            sign[k][it]=it*0.2;
        }
    }
    return sign;
}


int main(int argc, char *argv[])
{
    int i,isrc,n=3,nloc=1;
    float **sign=NULL;
    for (isrc=0;isrc<n;isrc++){
        sign = fun(nloc);
    }
    for (i=0;i<nloc;i++){
        free(sign[i]);
    }
    free(sign);
    exit(0);
}

这是一个正确的代码片段。我的问题是:为什么我们可以在每次迭代中为指针分配内存而不必先释放它是合法的?

【补充信息】:

大家好,我认为有一种情况我们无法free在循环中记忆。如果buffer=pandp被定义在循环之外,例如:

float *buffer, *p;
/* Elements of p calculated */
for (...){
    /* allocate memory for **buffer */    
    buffer = p;
    free(buffer)
    /* if free here will cause p lost */
}

如果buffer在每个循环结束时释放,可能会p因为bufferp共享相同的内存地址而导致丢失。

标签: cpointersfunction-pointersfreedynamic-memory-allocation

解决方案


为什么我们可以在每次迭代中为指针分配内存而不必先释放它是合法的?

释放动态分配的内存的责任留给了程序员。这是合法的,因为编译器不强制执行它,尽管有代码检查工具可以标记这个问题。

释放动态分配的内存应该按照分配的相反顺序进行。例如:

for (i=0;i<nloc;i++)
    free(sign[i]);

free(sign);

推荐阅读