【问题标题】:When to free memory inside a C code?何时释放 C 代码中的内存?
【发布时间】:2010-01-10 20:14:19
【问题描述】:

例如,当我在 while 循环之外分配内存时,可以在其中释放它吗? 这两个代码是等价的吗?

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
  free(memory);
}


int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
}
free(memory);

【问题讨论】:

  • 你的意思是“if 语句”而不是“while 循环”
  • 确保为mallocfree 编写包装函数。这样,如果您想更改底层实现(例如,使用更快的内存分配函数),只需更改两行(mallocfree 的行)。它可以让你避免重复代码。

标签: c memory malloc calloc


【解决方案1】:

是的,它们是等价的。如果分配不成功,您不必调用 free()
注意,memory 是指向 int 的指针,您必须取消对它的引用才能为其内存块分配一些东西;

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory)
    *memory=10;
free(memory);
memory = NULL;

【讨论】:

  • 不,它们不相等。当malloc 失败时,一个版本会调用free 而另一个不会。
【解决方案2】:
int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
  free(memory);
}

这会崩溃。您正在设置指向内存位置 10 的指针,然后要求系统释放内存。即使在虚拟地址空间的疯狂世界中,您之前分配的一些内存恰好从 10(十六进制的 0xA)开始也是极不可能的。此外,如果 malloc 失败,则没有分配内存,因此您不需要释放它。

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
}
free(memory);

这也是一个错误。如果 malloc 失败,那么您将指针设置为 10 并释放该内存。 (和以前一样。)如果 malloc 成功,那么您将立即释放内存,这意味着分配它是没有意义的!现在,我想这只是为了理解这一点而简化的示例代码,而这在您的实际程序中不存在? :)

【讨论】:

    【解决方案3】:

    如果你确定你只释放一次也没关系。

    一个好主意是当你释放它时总是设置一个指针=NULL,然后如果它再次被释放就没有关系了

    【讨论】:

    • 哦,现在我希望我能更好地关注 man 3 免费页面。在释放对象之前,我的代码中充斥着对 NULL 的检查!
    • 每个人都这样做 - 但几乎没有人检查 malloc 是否返回 NULL
    【解决方案4】:

    是的。重要的是太免费了一次。 (使用完内存后)

    【讨论】:

      【解决方案5】:

      我喜欢遵循的一般经验法则是在分配内存的同一范围内释放内存。

      【讨论】:

        【解决方案6】:

        首先,您只能释放它一次。因此,如果您想在循环中释放它(正如您的问题所建议的那样),第二种解决方案是唯一正确的做法。

        如果你想在 if 语句中释放它,这两种解决方案在技术上都是正确的。但是,始终释放您使用的内存是一个好习惯,这样在任何 if 语句之外始终释放内存会更容易。

        所以我的建议是:无论您尝试做什么:始终在任何循环/if 语句之外释放内存(当然,假设您不再需要它)。我通常在最后一次使用它的函数末尾释放它,但这实际上取决于函数本身,它的长度,......

        尝试找到自己的做事方式并坚持下去:它会为你节省很多无用的大脑时间(这真的很宝贵)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-07
          • 2020-09-10
          相关资源
          最近更新 更多