【问题标题】:Memory allocation / release in CC中的内存分配/释放
【发布时间】:2013-08-19 08:58:37
【问题描述】:

我知道在像 c 这样的语言中,我需要在分配内存后释放内存。 (我来自java),对此我有几个问题:

  1. 当我在做的时候:

    int array[30];      
    

    (即创建一个大小为 30 个整数的数组)与 正在做?

    int array[] = malloc(sizeof(int)*30);
    
  2. 作为第一个问题的序列,当我创建数组时 在函数内部(即函数的本地而不是全局的 整个文件),我需要释放这个数组的内存吗? 我创建它的功能? (我没有看到任何其他方法 释放它,因为我无法将创建的所有数组的引用传递回 main() 函数)。

简而言之,我想确切地知道何时需要为创建的对象/基元(在函数内部或外部)释放内存。

【问题讨论】:

  • 请看here。这不是答案,但肯定会有所启发。
  • @user2030118 请使用 I 而不是 i 进行自我参考。
  • 谢谢你的链接,我去看看

标签: c arrays malloc declaration


【解决方案1】:

如果你说

int array[30];

这是在堆栈上,当它超出范围时会自动为您清理。

如果你说

int * array = (int *)malloc(sizeof(int)*30);

内存将分配在空闲存储(堆)上,您负责释放它

free(array);

无论代码是在函数调用中还是在 main 中,这同样适用。 如果使用malloc,则需要使用free

【讨论】:

  • 非常感谢您简单而出色的回答!
【解决方案2】:

不,完全不一样。

第一个使用“自动分配”来预留内存,一般在栈上。一旦对象超出范围(例如函数返回时),此内存将自动释放。

第二个使用malloc()“在堆上”分配内存;当不再需要此内存时,必须使用 free() 取消分配。

另外,正确的语法是:

int *array = malloc(30 * sizeof *int);

你不能像在 C 中那样使用[]

【讨论】:

    【解决方案3】:

    您的数组int array[30] 将被放入堆栈,一旦array 超出范围,它分配的内存将自动释放。但是,当您使用malloc/calloc/realloc 分配内存时,您需要显式地free 这块内存。

    【讨论】:

      【解决方案4】:

      基本上malloc 在堆中分配内存并且在失去作用域后不会被释放。所以使用malloc分配的内存应该使用free释放。

      【讨论】:

        【解决方案5】:

        如果您使用int array[30],则您在堆栈上分配数组,并且它仅存在于创建它的范围内。 如果使用malloc,则必须使用free手动释放内存。

        这两种方法是不同的,并且服务于不同的需求。堆栈分配的变量/对象的范围有限,而您可以在本地范围之外使用 malloc'd 对象。

        malloc 与指针一起使用,但:

        int *array = malloc(sizeof(int)*30);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-28
          • 1970-01-01
          • 2012-11-06
          • 2011-03-29
          • 2012-01-16
          • 2013-11-22
          • 1970-01-01
          相关资源
          最近更新 更多