2015-11-03 25 views
2

我试图获取C++内存管理的挂件,并试图故意使用无限循环的新语句崩溃我的程序。据我所知,这只是在记忆堆上留出越来越多的空间。但是我的程序不会崩溃。在Windows任务管理器中进行监控时,它会消耗大约6GB的内存,然后降至5GB,再次升至6GB等。如何(故意)导致程序崩溃在C++中使用新

与此同时,我的硬盘正在快速充满。在分配大约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; 
} 
+0

它不会粉碎,分配将失败,指针d将得到一个'nullptr'。 – SHR

+0

在我的系统上分配了64+ GB(可能是Windows许可证的限制)后发生了奇怪的事情。你只是不够执着。 :-) –

+0

@SHR在考虑David的提示后,我还为'std :: bad_alloc'添加了一个try/catch块来捕获程序何时会耗尽内存。看到我的评论下面他的回复更多信息。 –

回答

1

现在,我有8GB的RAM,并根据Windows设置“虚拟内存大小”(我猜它的交换,对吧?)大约为1.5GB〜。

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

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

你说的1.5GB是你的页面文件的大小。

但是我能够分配的远不止这些。什么决定了该计划是否会最终崩溃?它使用了什么内存?

它使用虚拟内存,一个64位操作系统可以创建兆兆字节。这不是稀缺资源。

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

+0

他正在分配内存,但仅限于短。下一个循环将覆盖它。 –

+0

@ott你是否暗示OP的编译器有垃圾回收? – Yakk

+0

谢谢你的抬头。所以基本上只是保留了很多_adresses_?对于我的程序,我也注意到虽然页面文件的_current_大小为1.5GB,但它实际上被设置为_auto_,所以它只是增加它,因为请求更多的内存(在我使用内存之后)。我将页面文件设置为1GB的固定大小,实际上,程序在很短的时间内崩溃。有趣的是,根据15GB后的输出,这不是我所期望的(8GB RAM + 1GB Swap/Pagefile) –