繁体   English   中英

如果我的应用内存不足怎么办?

[英]What happens if my app is out of memory?

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

但是,如果我调用带有局部变量的方法怎么办? 它们也占用内存。 有什么方法可以为“普通”变量保留内存吗? 这样即使new()抛出异常,我也可以捕获它,修复问题并像往常一样调用方法。

您的数据通过以下三种方式之一分配:

  • 静态分配的数据(静态成员或全局变量)在应用程序启动时分配,这意味着它们并不是真正的问题。
  • 堆栈分配的数据分配在堆栈上(惊奇!)。堆栈是为局部变量和函数堆栈帧预留的内存区域。 如果空间用完了,将无法确定会发生什么。 一些实现可能会检测到它,并给您访问冲突/分段错误,而其他实现只会使您覆盖堆数据。 在任何情况下,都无法检测到此情况,因为通常没有办法处理它。 如果堆栈空间不足,则无能为力。 您甚至不能调用函数,因为这会占用堆栈空间。
  • 堆分配的内存是您在调用new / malloc时使用的内存。 在这里,您可以检测到内存不足的情况,因为您可以处理它。 (而不是分配200mb,您也许可以使用100mb,而只需在中途交换数据)

但是,除非执行一些繁重的递归操作,否则通常不应该用完堆栈空间。

C ++语言不提供任何用于为局​​部变量保留内存的机制。 您的特定C ++实现和/或操作系统可以提供一些增加总堆栈大小的方法,但这通常不是必需的。

还要注意,如果对new的调用确实失败了,从恢复中恢复实际上几乎没有什么可做的。 许多人(包括我在内)不再费心检查新的故障。

New从堆中分配内存,但是本地var通常在堆栈上-可能会溢出,但可能性较小,具体取决于您的平台。 您能否提供更多详细信息?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM