【问题标题】:What Happens If You Set Allocated Memory To NULL in C如果在 C 中将分配的内存设置为 NULL 会发生什么
【发布时间】:2015-05-25 07:10:55
【问题描述】:

在分配指针之前和之后设置指向NULL的指针有区别吗?

例如,有什么区别

char* c = NULL;

char* c = malloc(sizeof(char));
c = NULL;

这些语句的含义是什么,如果有的话,在每种情况下调用free(c) 有什么不同吗?

【问题讨论】:

  • 尝试循环执行第二个 :)

标签: c null malloc free dynamic-memory-allocation


【解决方案1】:

让我们看看这两种情况。

案例一:malloc 之前

嗯,这里几乎没有造成任何伤害。除非指针以前指向某个东西,否则指针只是设置为 NULL 并且不指向任何内容。在指向什么都没有的指针上调用 free() 什么都不做。 “解放人民?”好的。 “免费的?”你不能真正释放已经有点“免费”的东西。没有陌生人,没有危险。继续……

案例2:malloc之后

让我们分解一下:

char* c = malloc(sizeof(char));
c = NULL;

第一个命令会为您的程序从操作系统保留内存。这是动态分配——动态地获得更多内存。

第二个命令将您的指针设置为 NULL。那是什么意思? 内存泄漏。 这意味着你的程序基本上已经从操作系统借用了内存而忘记了它。这是一个很大的禁忌。如果一个程序一遍又一遍地这样做,它们最终会崩溃(或者整个系统都会崩溃)。

就像你应该总是把东西还给朋友一样,你应该总是把内存还给操作系统。因此,你必须总是为你malloc()的每一点调用free();就像 C 或 C++ 中的左方括号 ()、[] 或 {}。

在 free() 与其关联的内存之前,切勿将指针设置为 NULL。

【讨论】:

  • 注意,在一些没有操作系统的系统上,malloc()free() 的含义通常略有不同。操作系统通常管理内存——但在嵌入式系统上,比如迷你机器人,通常没有内存管理器——程序员可以自己编程内存管理器。无论如何,结论是一样的——你“保留”使用的总是“空闲”的内存。内存是一种有限的资源——最好始终保持保守。
  • “从不将指针设置为 NULL”如果您仅将指针视为用于分配/释放目的的句柄,则这是一个好习惯;但是,有许多算法可以搜索树、链表等,其指针保存当前/下一个/直接父节点。在这种情况下,不会发生分配或释放,在使用之间将这些指针重置为 null 可能是一个好习惯。
  • @Edwin Buck 这两个术语——仅在 free() 之后的 NULL 和使用指针后的 NULL 是迭代器/搜索器——不是互斥的。很好的提醒。
【解决方案2】:

在分配它之前,它可能有(取决于它被声明的位置)其中的垃圾数据。通过之前将其分配为 null,您基本上可以确保它处于已知的良好状态。

将地址分配并赋值给变量后,将指针设置为null意味着指针将不再引用分配的内存。通常这会造成内存泄漏(分配的内存位不能再被引用,因此无法释放)。然而,有时这是合适的。例如,如果您的逻辑有两个对内存的引用,一个用于分配/解除分配目的,一个用于“当前感兴趣的项目”,则可能适合分配当前感兴趣的项目,然后将 null 分配给它作为“当前项目”感兴趣的”指针与内存分配和释放无关。

最后,如果它是一个用于释放的指针,在你free() 指针之后,你可能想要将指针设置为空,原因与在分配之前将指针设置为空相同(使确保您的程序不会因为在指针中查找地址值而不是您想要访问的内存而感到困惑)。

【讨论】:

  • 只有free(...) 实际上将内存归还给操作系统。 pointer = null; 对内存没有任何作用,它将存储在变量pointer 中的地址设置为0,这是一种表示“指向无地址”的约定
【解决方案3】:

您没有将分配的内存设置为 NULL,而是将 指针 设置为 NULL,以便它不再指向您分配的内存。当你在它上面调用free 时,你并没有释放你分配的内存,因为指针没有指向它。

这称为内存泄漏:您已经分配了一些内存,但您不再拥有指向它的指针,因此您无法释放它,因此该内存将保持“正在使用”并且其他程序无法使用,即使你实际上不再使用它了。

在 NULL 指针上调用 free 无效。

【讨论】:

    【解决方案4】:

    是的,有区别。第二个导致内存泄漏。

    至于你的第二个问题,如果c = NULL,那么free(c)就没有效果了。

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 2016-12-12
      • 2019-07-19
      • 2012-06-16
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多