【问题标题】:Do I need to free char array of fixed length? [duplicate]我需要释放固定长度的字符数组吗? [复制]
【发布时间】:2015-06-25 09:54:15
【问题描述】:

据我从其他 SO 问题的答案中可以看出,我不需要像下面这样释放固定长度的数组:

unsigned char buffer[16];

但一般来说,每当调用mallocmemcpy 等时,都必须释放内存。

我的问题是:在以下情况下是否需要拨打free

unsigned char buffer[16];
memcpy(buffer, source, 16);
...
free(buffer); // needed?

更准确地说:是使用堆还是栈,是基于变量的声明还是初始化?

【问题讨论】:

  • 不,您不得释放这样的数组。说非静态局部变量具有自动存储持续时间是有原因的……另外,忘记“堆栈”和“堆”。 C 标准只为自动、静态和动态存储持续时间指定抽象语义。不需要使用堆栈和堆来实现它们。
  • 你在哪里找到 memcpy 的“必须释放内存”?
  • @tivn 实际上我在这里弄错了。更新了问题,所以其他人不会学到错误的东西;)
  • 基本上,您是在回答自己的问题:buffer 是来自malloccalloc 还是realloc?不。所以你不仅不必释放它,而且你可能不会释放它。

标签: c memory-management memory-leaks malloc free


【解决方案1】:

您只有 malloc()/calloc()/realloc() 返回的 free() 指针,传递任何未由这些函数之一返回的指针都是未定义的行为。

在你分配数组的情况下

unsigned char buffer[16];

在函数内部,数组将在超出范围时自动自动释放,即在函数返回时。

数组实际上只在它声明的范围内有效

if (condition != 0)
 {
    unsigned char buffer[16];
 }
/* here it was already deallocated */

上面的示例很好地证明了使用 gcc 启用 -Wshadow 是合理的。

【讨论】:

  • 现在明白了。*Returned by* 是这里的重要短语。
【解决方案2】:

如果一个数组在栈上,你不需要释放它;栈帧弹出时会自动回收。

如果数组在堆上(使用 malloc 或类似函数分配),则需要显式释放。否则你有内存泄漏。

【讨论】:

    【解决方案3】:

    不,您已在堆栈上分配了对象,因此不需要空闲。如果您使用 malloc,您将在堆上分配内存,然后您必须释放它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-16
      • 2014-01-21
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      相关资源
      最近更新 更多