函数内存不足-我该怎么办

out of memory within a function - what do i do?

本文关键字:我该怎么办 内存不足 函数      更新时间:2023-10-16

最近有人问我,如果函数内存不足,例如在函数中分配了太多内存,我应该如何解决问题(在C++中)。你将如何克服这个问题?

非常感谢

正如其他人所说,这在很大程度上取决于您正在编写的系统类型。然而,一般来说,您应该做的第一件事是打印一条好的、描述性的错误消息。在某些系统上,添加更多RAM不是一个选项。您可能还需要增加一个适当的统计计数器。退出应用程序可能不合适。例如,实时应用程序在重载期间经常会耗尽堆空间,但它们不会关闭。它们只是在系统负载恢复正常之前无法分配内存。

我不同意fvu的观点,他建议将堆栈变量移到堆中,原因如下:1.如果问题是堆栈空间不足,则(在大多数系统中)无法检测到。堆栈溢出是一个很难追踪的问题,除非你有适当的检查
2.由于面试官提出的要求是你可以检测到内存分配失败,这是因为你的堆已经耗尽。因此,将堆栈变量移动到堆上进行实例化是个坏主意。

将当前不需要的东西序列化到硬盘,然后解除分配并重新呼吸。

您只需编写更高效的代码,就不会占用如此巨大的内存,如果您不能做任何更高效的事情,那么就购买更多的内存。对不起,我确实抄了阿伦和安德烈说的答案,但这也是我想到的。

首先,我想你的面试官想知道你是否能够区分堆栈分配的变量(函数体内声明的变量)和堆分配的变量。在其他原因中,这种差异非常重要,因为堆栈通常比堆更受约束。

因此,如果不能选择优化变量,那么一个有效的响应就是将它们从堆栈移到堆中。怎样

  1. 通过在函数体外部声明变量
  2. 通过malloc'指定所需房间

当然,这将导致下一个问题,因为它们都会带来其他挑战,例如:

  1. 并发问题和可变可见性
  2. C没有垃圾收集器,所以malloc'ed的东西需要是free'd

在C++中,这将导致new内部的throw bad_alloc;或执行分配的任何内容。

这意味着代码将自动进入离分配调用所在位置最近的(合适的)catch块。在这一点上,有很多不同的选择。

然而,"克服"内存不足并不是你可以笼统地说你做了什么——这在很大程度上取决于你为什么内存不足,应用程序应该做什么,还有哪些其他分配(也许我们可以释放一些不是绝对需要保留的数据,比如一些用来获得更好性能的缓存表,但如果没有,它仍然有效)。或者你可以弹出一条信息说"内存不足,正在退出"。