功能内存不足 - 我该怎么办?

时间:2013-06-24 17:57:39

标签: c++

我最近被问到如果一个函数耗尽内存,我应该如何解决问题(在C ++中),例如,如果在函数中分配了太多内存。你会如何克服这个问题?

非常感谢

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你只需编写更有效的代码就可以不占用如此庞大的内存,如果你不能做更高效的事情,那就买更多的内存吧。 对不起,我确实复制了aaronman和andre所说的答案,但这也是我想到的。

答案 2 :(得分:0)

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

所以一个有效的响应 - 如果优化变量不是一个选项 - 将它们从堆栈移动到堆。怎么样?

  1. 通过在函数体外声明变量
  2. malloc所需的房间
  3. 当然,这会导致下一个问题,因为它们都会带来其他挑战,例如:

    1. 并发问题和变量可见性
    2. C没有垃圾收集器,因此malloc'ed stuff需要free'd
    3. ...

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

这意味着代码将自动结束在最适合分配调用之外的(合适)catch块中。那时,有很多不同的选择。

然而,“克服”内存不足是你可以说你用通用术语做什么 - 它将在很大程度上取决于你为什么缺乏内存,应用程序应该做什么,存在什么其他分配(或许我们可以释放一些并非绝对必要的数据 - 例如一些缓存表用于获得更好的性能,但如果你没有它们,它仍然可以工作)。或者你可以弹出一条消息说“内存不足,退出”。