我怎样才能释放记忆?

时间:2016-03-07 13:07:51

标签: c memory memory-leaks

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

int * doall() {
    int *a;
    a=(int*)malloc(sizeof(int)*2);
    a[0]=2;
    a[1]=3;
    return a;
}
int main() {
    int *arr;
    arr=doall();
    for(int i=0;i<2;i++) {
        printf("%d ",arr[i]);
    }
    printf("\n");
    free(arr);
    return 0;
}

是否可以free(a);free(arr)是否取消分配&#34; a&#34;在doall函数?

doall a=(int*)malloc(sizeof(int)*2);

4 个答案:

答案 0 :(得分:4)

由于malloc返回doall返回的指针,并且free调用了该指针,因此

虽然有两点

  1. 不要将malloc的结果强制转换为C.(您需要在C ++中执行此操作。)

  2. 如果您使用的是C ++,请使用new[]delete[]来管理阵列内存。更好的是,使用std::vector

答案 1 :(得分:4)

  

是否可以free(a);

没有。到doall完成时,没有变量a,只有。但是,由于此值已分配给arr,因此您的程序会保留对doall已分配的块的引用。

  

free(arr)功能中a是否取消分配doall

它不会释放a因为free被称为变量a已经消失了。但是,它会释放先前已分配给a的内存,因此不存在内存泄漏。

答案 2 :(得分:1)

当您调用malloc时,您将获得返回的已分配内存的地址。您将其存储在局部变量a中,该变量仅在函数执行时才存在。

但是当你return a返回该局部变量的副本时,调用者将其存储在变量arr中。此副本是在a超出范围之前拍摄的。

free不知道或关心变量名称。它唯一关心的是它获得一个地址,该地址对应于之前调用malloc的返回地址之一。在你的情况下它做了什么,所以一切都很好。

答案 3 :(得分:0)

一旦函数返回,

a就会被释放。在C中,局部变量被压入堆栈并在返回时弹出。