我的 C++ 程序在内存不足时究竟是如何终止的?

Posted

技术标签:

【中文标题】我的 C++ 程序在内存不足时究竟是如何终止的?【英文标题】:Exactly How Does My C++ Program Terminate When it Runs Out of Memory? 【发布时间】:2010-03-24 18:43:26 【问题描述】:

以下 C++ 程序在我的 Windows XP 机器上崩溃并显示“程序异常终止”消息

class Thing ;
int main()
    
    for (;;) new Thing();    

我会说这是一个内存不足的问题,但我不确定 Windows 是否接近极限。是Windows故意杀死它吗?如果是,它是如何决定的?

【问题讨论】:

【参考方案1】:

你说得对,这是导致程序结束的内存不足问题。但决定以“异常程序终止”结束它的不是 Windows。当new Thing 分配内存失败时,是 C++ 运行时(Windows 上的“msvcrt*.dll”)引发了std::bad_alloc 异常。

您可以通过简单的更改来验证:

#include <exception>
#include <iostream>
class Thing ;
int main()

    try
        
        for (;;) new Thing();    
    
    catch(std::bad_alloc e)
    
        std::cout << "ending with bad_alloc" << std::endl;
            

当程序内存不足时,这将正常结束程序。如果您没有捕获该异常,则未处理的异常将由 C++ 运行时处理,从而创建著名的“异常程序终止”消息(或类似消息)。

【讨论】:

cout的operator @AshleysBrain:我认为std::cout &lt;&lt; 不会分配任何内存。也许它需要一些堆栈空间,但那是保留的内存,所以 IMO 不需要更多的堆空间。【参考方案2】:

是 CRT 杀死了你的程序。未处理异常(此处为 std::bad_alloc)所需的行为是调用 terminate()。在 MSVC 实现中显示“异常程序终止”消息并调用 abort() 来终止程序。

【讨论】:

【参考方案3】:

您是否尝试在调试中运行它?

在我的情况下(Win7)它给出了这个错误:这个应用程序已经请求运行时以一种不寻常的方式终止它。请联系应用程序的支持团队了解更多信息。

但在调试模式下,它显示 operator new 抛出了异常 bad_alloc,这意味着内存不足。

【讨论】:

我最不喜欢的错误消息之一。如果它对用户来说毫无意义,它至少不应该为程序员提供一个提示吗? 程序员必须捕捉可能的异常【参考方案4】:

毫无疑问,你的虚拟机已经用完了。

【讨论】:

这取决于他的交换文件的大小。有了足够大的交换空间(这对于 XP 等 32 位操作系统来说很容易),您将在内存不足之前填满每个进程的地址空间。

以上是关于我的 C++ 程序在内存不足时究竟是如何终止的?的主要内容,如果未能解决你的问题,请参考以下文章

UIImageView 不释放内存(根据 VM Tracker) - 内存不足警告和终止

C++程序,内存占用一直增加,最后无法分配内存而中断

C++ 优先队列push()时,出现内存不足,怎么办,能又啥办法解决吗

C++三种内存分配方式

Linux OOM Killer

应用程序收到内存不足警告但只有 5.7MB 的活动字节