【问题标题】:How can I free memory?我怎样才能释放内存?
【发布时间】:2016-03-07 13:07:51
【问题描述】:
#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) 是否在 doall 函数中释放“a”?

doalla=(int*)malloc(sizeof(int)*2);

【问题讨论】:

  • 是的,它将被释放。
  • free(arr); 将释放 doall() 中分配的内存

标签: c memory memory-leaks


【解决方案1】:

可以free(a);

没有。当doall 完成时,没有变量a,只有它的。但是,由于该值随后被分配给 arr,因此您的程序将保留对 doall 已分配的块的引用。

free(arr) 是否在 doall 函数中释放 a

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

【讨论】:

  • 一定要free(arr);吗?
  • @shibly 是的,您别无选择,只能在doall 返回后释放a 的值。否则会出现内存泄漏,因为doall 本质上将它使用malloc 分配的内存块的“所有权”转移到main 函数。
【解决方案2】:

由于malloc 返回的指针由doall 返回,并且free 调用了该指针,因此内存正确释放。

两点

  1. 不要在 C 中转换 malloc 的结果。(您需要在 C++ 中这样做。)

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-01-28
        • 1970-01-01
        • 2014-10-04
        • 2011-10-30
        • 2021-12-30
        • 2018-07-21
        • 2023-01-11
        • 2020-04-05
        • 1970-01-01
        相关资源
        最近更新 更多