2015-11-03 57 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) –