gpt4 book ai didi

c++ - 处理失败的内存分配

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:16 25 4
gpt4 key购买 nike

这个问题更像是一个完整性检查,而不是“请解决我的问题”。我最近继承了一个应用程序的一些代码,该应用程序由许多具有不同技能的不同开发人员编写了几十年。因此,试图理解代码实际想要做什么本身就是一项使命。

无论如何,我一次又一次地遇到这种动态分配内存的初始化模式,并且很快就检查了结果。因为这段代码同时存在于独立库和 GUI 中,所以之前的开发人员使用 _STANDALONE 宏来检查它并相应地处理错误:

double *myArray = (double *) calloc(length, sizeof(double));
if (myArray == NULL)
{
strcat(message1, "myArray");
#ifdef _STANDALONE
fprintf(stderr, "%s %s\n", message1, message2);
#else
MessageBox(Window, message1, message2, MB_ICONEXCLAMATION);
#endif
exit(EXIT_FAILURE);
}

注意:您可以假设 message1message2 包含一个字符串“无法为变量分配内存...”并且足够大以容纳额外的内存gubbins 附加到它。

完整性检查来了。内存分配失败的最可能原因是操作系统没有任何备用内存。让我们看一下错误处理代码,如果我们假设没有更多的内存空闲:

  • fprintf 可能会或可能不会失败,具体取决于内部缓冲区的状态。我不知道发动机罩下的功能是什么样子,但我假设它的内存需求很小。
  • 我很确定调用 MessageBox 会导致额外的内存分配,因为这会导致 GUI 对象显示在屏幕上。因此,这肯定会失败,因此无法实现开发人员的意图。

简而言之,我建议可以更好地处理这个问题,但要采取的正确路径并不是那么明显。

最佳答案

仅仅因为 calloc 失败并不意味着错误处理路径也会失败。

  • calloc 可能因为请求荒谬而失败。例如,如果 length * sizeof (double) 溢出,calloc 应该失败。或者即使没有溢出,请求一开始也是不合理的内存量。在这些情况下,可能会有大量可用内存供 fprintfMessageBox 使用。

  • 如果不知道 fprintfMessageBox 的实现,您就无法确定它们是否需要额外的内存分配。也许系统已经为它们预留了一些内存,以便在内存不足的情况下显示错误消息。

我不会担心 fprintfMessageBox 失败。如果您的系统确实没有足够的可用内存来处理 fprintfMessageBox,它可能会以许多其他方式崩溃。面对如此极端的内存压力而终止是非常合理的。

关于c++ - 处理失败的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30503229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com