如果我的应用程序内存不足会怎样?

时间:2009-04-25 13:41:46

标签: c++ memory-management

如果我的应用程序内存不足,当我调用new()时,我将获得异常,而malloc()我将得到0指针。

但是如果我用一些局部变量调用一个方法呢?他们也占据了记忆。有没有办法为“正常”变量保留内存?所以,即使new()抛出异常,我也可以抓住它,修复东西并仍然像往常一样调用方法。

4 个答案:

答案 0 :(得分:6)

您的数据分配方式有三种:

  • 在应用启动时分配静态分配的数据(静态成员或全局变量),这意味着它们确实不会成为问题。
  • 堆栈分配的数据在堆栈上分配(出乎意料!)堆栈是为局部变量和函数堆栈预留的内存区域。如果那里的空间不足,那么未定义会发生什么。某些实现可能会检测到它并为您提供访问冲突/分段错误,而其他实现只会使您覆盖堆数据。在任何情况下,都无法检测到这一点,因为通常情况下无法处理它。如果你的堆栈空间不足,那么你无能为力。你甚至无法调用函数,因为它会占用堆栈空间。
  • 在调用new / malloc时使用堆分配的内存。在这里,您有一种机制来检测内存不足的情况,因为您可能能够处理它。 (而不是分配200mb,你可能可以使用100mb,只需将数据中途交换)

除非你执行一些重复的递归,否则通常不应该耗尽堆栈空间。

答案 1 :(得分:3)

C ++语言没有提供任何为本地变量保留内存的机制。您的特定C ++实现和/或操作系统可能会提供一些增加总堆栈大小的方法,但通常不需要这样做。

另请注意,如果对new的调用失败,那么实际上很难从中恢复。很多人(包括我在内)不再费心去检查新的故障。

答案 2 :(得分:1)

New从堆中分配内存,但是本地变量通常在堆栈上 - 这可能会溢出,但不太可能,具体取决于您的平台。你能提供更多细节吗?

答案 3 :(得分:1)

编译器知道每个堆栈需要多少内存。但是,足够多的堆栈(由于递归引起)会使程序崩溃 - 可能没有其他方法可以解决这个问题。

该标准有一个名为实施数量的有趣附件。这是非规范的(提供信息的),因此不应被视为绝对真理,而是为您提供一个公平的想法。