【问题标题】:Why some people don't check for NULL after calling malloc?为什么有些人在调用 malloc 后不检查 NULL?
【发布时间】:2012-04-14 22:11:59
【问题描述】:

前段时间我从网上下载了一个源代码。有几个 malloc 调用,之后没有检查 NULL。据我所知,您需要在调用 malloc 后检查 NULL。

有人在调用 malloc 后不检查 NULL 是否有充分的理由?我错过了什么吗?

【问题讨论】:

  • 顺便说一句,这就是异常优于错误代码的原因。
  • 因为前面还有更重要的事情:gustedt.wordpress.com/2011/11/05/…
  • 再补充一条信息:问题中提到的代码是由 Microsoft MVP 创建的。

标签: c pointers memory-management null malloc


【解决方案1】:

正如 Jens Gustedt 在评论中提到的,当 malloc() 返回错误时,您的程序可能已经陷入困境。当程序可能无法做很多事情时,放入一堆错误处理代码来处理这种情况是否有意义?对于许多程序来说,答案可能是“不”,而对于其他程序来说,做一些适当的事情可能非常重要。

您可以尝试通过一个简单的“malloc-or-die”包装函数来分配内存,以保证分配成功或程序将终止:

void* m_malloc(size_t size)
{

    void* p;

    // make sure a size request of `0` doesn't trigger
    // an error situation needlessly 
    if (size == 0) size = 1;

    p = malloc(size);

    if (!p) {
        // attempt to log the error or whatever
        abort();
    }

    return p;
}

然后您遇到的一个问题是,除了终止程序之外,您无法可靠地做很多事情。即使记录问题也可能需要分配一些内存,因此日志记录工具可能会有自己的问题(除非您的分配失败是由于试图分配不合理的大内存块)。

您可以尝试通过在程序早期分配一个“故障安全”块来解决该问题,当您需要记录问题时可以释放该块(我认为有很多程序使用这种策略)。但是您愿意在这种错误处理中投入多少工作取决于您的具体需求。如果您的程序需要确保在 malloc() 返回错误时完成某些非常复杂的事情,您需要有相应的保护措施以确保您可以在非常低的内存中完成这些事情情况。通常,这意味着额外的复杂性,而且可能并不总是值得付出努力。

【讨论】:

    【解决方案2】:

    人们不检查是因为他们懒惰,这使他们的代码更丑陋,而且他们不想弄清楚如何从各处的错误中恢复。

    我听一些程序员说,“如果我不能 malloc 一个块,那么系统很快就会崩溃,因为 VM 已满,那我为什么还要检查呢?”

    我不同意。您应该检查错误,即使这意味着只记录错误并调用 exit() 或抛出异常。虽然我们倾向于使用具有巨大磁盘和永远在线分页内存的系统,但行业已经发生了翻天覆地的变化,现在我们拥有内存有限且没有按需分页的智能手机和平板电脑。另外,即使在桌面上,我们的数据集也增长得如此之快,以至于有时 malloc 会失败。

    如果您不想在任何地方添加额外的代码行,只需编写自己的 malloc 替换,调用 malloc 并检查错误并使用它来代替 malloc。

    【讨论】:

      【解决方案3】:

      他们只是不关心意外崩溃!

      当你执行 malloc 时,你很可能会立即存储一些东西。因此,如果您不检查 NULL,则程序可能会在尝试在那里存储内容时崩溃。

      这在小型程序中不太可能发生,因为当请求少量内存时 malloc 几乎不会失败。所以 malloc 不会返回 NULL。

      但在我看来,练习 NULL check for malloc 通常是好的,即使在小程序中也是如此。

      【讨论】:

        【解决方案4】:

        如果您需要更多内存,而malloc 无法给您更多内存,您能做些什么吗?
        我想优雅地退出。
        但如果你退出,我猜他们认为你如何退出并不重要(还不如崩溃和避免,他们认为检查 null 的“开销”)。
        也许功能是他们不需要清理代码?
        不过我不同意。您应该在 malloc 返回时检查 NULL

        【讨论】:

          猜你喜欢
          • 2015-12-17
          • 1970-01-01
          • 2015-11-24
          • 1970-01-01
          • 2012-09-08
          • 2013-05-16
          • 2011-03-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多