好吧,它当然取决于操作系统,但结果将是,每个人都相似。例如,当作为 32 位可执行文件运行时,与 VS2012 一致的构建将停止在 的向量中的 26,906,977 个元素处int*
,不会对您的内存构成威胁(甚至不会关闭)。
现在,当您构建 64 位版本时,它会变得很有趣,在这种情况下,bad_alloc
当(几乎)所有内存耗尽时会发生抛出异常。在这种情况下,没有任何 C++ 或任何其他语言可以保护您。
在下面的屏幕截图中,我发布了一个发生这种情况的示例:当bad_alloc
被抛出时,程序无法捕捉它或对它做任何事情。操作系统介入并杀死每个进程,并立即释放内存(见图)。在各自的 32 版本中,异常被正常捕获,释放大约需要 10 分钟。
现在这是一种非常简单的看待方式,我相信操作系统专家可以提供更多见解,但可以在家里随意尝试(并烧掉一些内存 - 我不能停止认为我可以闻到在此之后烧焦的东西)

截图中的代码
#include <iostream>
#include <vector>
#include <exception>
using namespace std;
int main()
{
vector<int*> maxV;
try
{
while (true) maxV.push_back(new int);
}
catch (bad_alloc &e)
{
cout << "I caught bad alloc at element no " << maxV.size() << "\n";
for (auto i : maxV) delete i;
}
catch (exception &e)
{
cout << "Some other exception happened at element no " << maxV.size() << "\n";
for (auto i : maxV) delete i;
}
return 0;
}