C malloc 故障

C malloc failure

提问人:Muszo 提问时间:7/30/2022 更新时间:7/30/2022 访问量:451

问:

我偶然发现了一个内存分配问题。我正在编写一个简单的应用程序,它应该读取文件并从中获取信息。它应该非常简单(单线程),所以我想知道如果失败,我该怎么办?malloc()calloc()

函数是否应该对程序进行一些错误消息或返回(或其他适当的返回值)并尝试再次分配内存?exit()NULL

c malloc 动态内存分配 calloc

评论

2赞 Dariush Eivazi 7/30/2022
如果 malloc 失败,最好的办法就是中止。您可能没有足够的资源来打印错误消息。
1赞 John Bollinger 7/30/2022
@I,代码用于在发生故障时向调用者提供信息的函数。将它们用作程序退出状态是不传统的,而且因为它不是常规的,所以它也不是很有用——人们通常不会将退出状态解释为代码。errnoerrno
1赞 John Bollinger 7/30/2022
@I亚布尔索夫,我知道你说的“退出”是什么意思,我的评论回应了这一点。对不起,不,人们通常不会将程序退出状态解释为代码,您提供的链接也没有其他建议。这并不是说没有人这样做,但同样,它不是传统的。使用或输出从代码派生的诊断消息是很常见的,但这是另一回事。errnoperror()strerror()errno
1赞 John Bollinger 7/30/2022
需要引用,@I łyaBursov。您尚未提供任何工具使用代码作为退出状态的证据。但是,请在您发布的第一个链接中阅读有关该问题的评论,这些评论支持我的说法。您似乎专注于解释代码的工具和支持(特别是命令行工具),但这与程序是否使用此类代码作为其退出状态无关。例如,MariaDB 链接位于有关如何使用 Maria API 的文档中,而不是其命令行工具中。perrorperrorerrno
1赞 Adrian Mole 7/30/2022
您应该执行的操作取决于上下文。如果您的程序逻辑可以处理尝试分配较少的内存,那么这是一个可以尝试的选项。如果您的程序在没有请求/失败的内存量的情况下根本无法运行,那么您将不得不以一种或另一种方式退出。

答:

1赞 Bill Morgan 7/30/2022 #1

如果 malloc 失败,您基本上有 3 个选项:

  1. 释放一些内存,然后重试。
  2. 不要分配,而是做其他事情。
  3. 退出程序。

假设您需要内存来存储一些数据,那么 2 将不是一个选项,在这种情况下,您要么执行 1 要么执行 3。

没有人能预测所有可能的程序,但我可以看到尝试分配但不使用内存的一个原因是在一个程序中,你只是在测试,看看在给定负载下可以在系统上分配多少内存。

无论如何,我认为 1 或 3 可能是大多数情况。