-2

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

非常感谢

4

5 回答 5

0

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

所以一个有效的响应——如果优化变量不是一种选择——将它们从堆栈移动到堆。如何?

  1. 通过在函数体之外声明变量
  2. 通过malloc'ing 所需的房间

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

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

...

于 2013-06-24T18:04:50.377 回答
0

将当前不需要的东西序列化到硬盘上,然后释放它并再次呼吸。

于 2013-06-24T17:59:57.730 回答
0

您只需编写更高效的代码即可不占用如此大的内存,如果您不能做任何更高效的事情,请购买更多内存。抱歉,我确实复制了 aaronman 和 andre 所说的答案,但这也是我想到的。

于 2013-06-24T18:01:02.953 回答
0

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

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

于 2013-06-24T18:23:35.120 回答
0

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

这意味着代码将自动结束在离分配调用最近的(合适的)catch-block中。在这一点上,有很多不同的选择。

但是,“克服”内存不足并不是您可以笼统地说出您所做的事情-这在很大程度上取决于您内存不足的原因,应用程序应该做什么,存在哪些其他分配(也许我们可以释放一些并非绝对需要保留的数据 - 例如一些用于获得更好性能的缓存表,但如果你没有它们,它仍然有效)。或者你可以弹出一条消息说“内存不足,退出”。

于 2013-06-24T18:24:56.560 回答