Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无限内存分配应用程序崩溃_C++_Windows_Memory_Allocation - Fatal编程技术网

C++ 无限内存分配应用程序崩溃

C++ 无限内存分配应用程序崩溃,c++,windows,memory,allocation,C++,Windows,Memory,Allocation,我有密码 #include <iostream> using namespace std; int main() { while(true) { try { new int; } catch(std::exception e) { } } return 0; } #包括 使用名称空间std; int main() { whil

我有密码

#include <iostream>

using namespace std;

int main()
{
    while(true)
    {
        try
        {
            new int;
        }
        catch(std::exception e)
        {

        }
    }
    return 0;
}
#包括
使用名称空间std;
int main()
{
while(true)
{
尝试
{
新int;
}
捕获(标准::异常e)
{
}
}
返回0;
}
所以,当我在Linux下运行这段代码时,我的计算机在内存结束时会冻结(正如预期的那样),但当我在Windows上时,我的应用程序在分配了3 gb内存后崩溃(通常我使用了1 gb,总共16 gb)。为什么会崩溃?如何预防


当我用
malloc(1)
替换
new int
时,在分配了这3 gb之后,内存不会分配更多的我猜它在Windows下崩溃只是因为您将其编译为x86而不是x64可执行文件。x86可执行文件的内存限制为3GB,因为它的地址不足。在Linux下,默认情况下编译64位(在使用g++的64位机器上),因此它不会在这里崩溃,而是冻结系统,因为系统在RAM耗尽后使用交换空间,速度非常慢。如果交换也被填满了,那么你的系统就会崩溃。将Windows版本编译为64位,然后看看会发生什么

我对本文的假设是您有一台64位的机器(否则您将无法使用那些16GB的RAM)


现在,当使用
malloc
而不是
new
时,您的程序不会崩溃,因为malloc具有错误状态。它只会给您一个
NULL
指针,因为它无法分配更多内存<代码>新的不会。

为什么您希望程序会冻结?这只是一种可能的行为,不是最好的,也不是最坏的(老实说,很可能是最坏的)。C++标准有很多地方,行为不明确。这显然是其中之一,因为它取决于底层操作系统层


尝试打印
catch
块中的内容。因此,您将知道应用程序何时崩溃—捕获异常之前或之后。分配更大的块,因为现在内存不足,C++运行时可能不正常工作,可能会导致崩溃。

“崩溃”是什么?确切地说,你想做什么?你的<代码> catch <代码>无效。在抛出
bad_alloc
异常后,您不能调用
new
,并且在该上下文中不可能发生其他异常。此外,编译器可以看到您实际上没有存储
新的
返回值并优化调用。异常应该通过常量引用而不是通过值捕获。查看您的代码,我甚至不明白您打算做什么?是的,当我使用g++64位时,它工作了!请告诉我,当我的Linux冻结时,只有80%的内存被占用?Windows不会发生这种情况,这更有可能导致竞争状况。先发生什么?输出还是冻结?可能输出也会导致此时冻结。