无限分配内存应用程序崩溃
Infinite allocation memory app crashes
我有密码
#include <iostream>
using namespace std;
int main()
{
while(true)
{
try
{
new int;
}
catch(std::exception e)
{
}
}
return 0;
}
所以,当我 运行 Linux 下的这段代码时,我的计算机在内存用完时冻结(正如预期的那样),但是当我在 Windows 上时,我的应用程序崩溃了分配 3 GB 内存后(通常我使用 1 GB,总共 16 GB)。为什么会崩溃?如何预防?
当我将 new int
替换为 malloc(1)
时,分配这 3 GB 后,内存不会分配更多
我的猜测是它在 Windows 下崩溃只是因为您将其编译为 x86 而不是 x64 可执行文件。 x86 可执行文件有 3GB RAM 的限制,因为它用完了地址。在 Linux 下,您默认编译 64 位(在使用 g++ 的 64 位机器上),因此它不会在这里崩溃但会冻结系统,因为系统在 RAM 不足后使用交换 space该死的慢。如果 SWAP 也被填满,那么你的系统就会崩溃。将 Windows 版本编译为 64 位,然后看看会发生什么。
我对这篇文章的假设是你有一台 64 位机器(否则你将无法使用那些 16GB 的 RAM)。
现在,当使用 malloc
而不是 new
时,您的程序不会崩溃,因为 malloc 有错误状态。它只会返回一个 NULL
指针,因为它无法分配更多内存。 new
没有。
为什么您认为该程序会冻结?这只是可能的行为之一,不是最好的也不是最坏的(老实说,很可能是最坏的)。 C++ 标准有很多地方有未定义的行为。这显然是其中之一,因为它依赖于底层OS层。
尝试在 catch
块中打印一些内容。因此,您将知道应用程序何时崩溃 - 在捕获异常之前或之后。分配更大的块,因为现在如果内存完全不足,C++ 运行时可能无法正常工作,并可能导致崩溃。
我有密码
#include <iostream>
using namespace std;
int main()
{
while(true)
{
try
{
new int;
}
catch(std::exception e)
{
}
}
return 0;
}
所以,当我 运行 Linux 下的这段代码时,我的计算机在内存用完时冻结(正如预期的那样),但是当我在 Windows 上时,我的应用程序崩溃了分配 3 GB 内存后(通常我使用 1 GB,总共 16 GB)。为什么会崩溃?如何预防?
当我将 new int
替换为 malloc(1)
时,分配这 3 GB 后,内存不会分配更多
我的猜测是它在 Windows 下崩溃只是因为您将其编译为 x86 而不是 x64 可执行文件。 x86 可执行文件有 3GB RAM 的限制,因为它用完了地址。在 Linux 下,您默认编译 64 位(在使用 g++ 的 64 位机器上),因此它不会在这里崩溃但会冻结系统,因为系统在 RAM 不足后使用交换 space该死的慢。如果 SWAP 也被填满,那么你的系统就会崩溃。将 Windows 版本编译为 64 位,然后看看会发生什么。
我对这篇文章的假设是你有一台 64 位机器(否则你将无法使用那些 16GB 的 RAM)。
现在,当使用 malloc
而不是 new
时,您的程序不会崩溃,因为 malloc 有错误状态。它只会返回一个 NULL
指针,因为它无法分配更多内存。 new
没有。
为什么您认为该程序会冻结?这只是可能的行为之一,不是最好的也不是最坏的(老实说,很可能是最坏的)。 C++ 标准有很多地方有未定义的行为。这显然是其中之一,因为它依赖于底层OS层。
尝试在 catch
块中打印一些内容。因此,您将知道应用程序何时崩溃 - 在捕获异常之前或之后。分配更大的块,因为现在如果内存完全不足,C++ 运行时可能无法正常工作,并可能导致崩溃。