如何(故意)使用新的

时间:2015-11-03 22:07:53

标签: c++ windows memory crash

我试图了解C ++内存管理并尝试使用无限循环的新语句故意崩溃我的程序。据我了解,这只是在内存堆上保留了越来越多的空间。但是我的程序刚刚崩溃了。在Windows任务管理器中进行监控,它将占用约6GB的内存,但随后降至5GB,再次升至6GB等。

与此同时,我的硬盘正在迅速填满。在分配大约30GB之后我停止了测试,因为我不想对我的SSD造成太大的压力。

现在,我有8GB的RAM,根据Windows设置,"虚拟内存大小" (我猜它是交换,对吗?)约为1.5GB。 但是,我能够分配更多。是什么决定了该计划最终会崩溃?它使用了什么记忆?

谢谢!

#include <iostream>
using namespace std;

int main() {
    long alloced = 0;
    while (true) {
        double *d = new double[12500000]; 
        alloced += 1;
        cout << alloced << " times 100MB" << endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

  

现在,我有8GB的RAM,根据Windows设置,&#34;虚拟内存大小&#34; (我猜它是交换,对吗?)约为1.5GB。

这是一种常见的混淆。 Windows碰巧通过其虚拟内存系统实现交换,这恰好是Windows虚拟内存系统中唯一可配置的设置。这导致很多人认为交换与虚拟内存相同。

这是不正确的。交换是在虚拟内存甚至存在之前发明的,并且有许多系统具有虚拟内存,根本没有交换(大多数家庭WiFi路由器)。他们完全不同。

您正在谈论的1.5GB是您的页面文件的大小。

  

然而,我能够分配更多。是什么决定了该计划最终会崩溃?它使用了什么记忆?

它使用了虚拟内存,64位操作系统可以在TB级内创建虚拟内存。它不是稀缺资源。

要使程序崩溃,您需要使用内存,而不仅仅是分配它。某些操作系统确实允许您对进程施加虚拟内存限制,但我不确定Windows是否是其中之一。 (这一般不是一个好主意。)