2010-03-24 44 views

回答

8

你是對的這是一個內存不足的問題,導致你的程序結束。但不是Windows決定以「異常程序終止」結束它。這是C++運行時(Windows上的「msvcrt * .dll」),當new Thing未能分配內存時會引發std::bad_alloc異常。

您可以驗證一個簡單的變化:

#include <exception> 
#include <iostream> 
class Thing {}; 
int main() 
{ 
    try 
    {  
     for (;;) new Thing();  
    } 
    catch(std::bad_alloc e) 
    { 
     std::cout << "ending with bad_alloc" << std::endl; 
    }   
} 

這通常會結束時程序是內存不足。如果你沒有捕獲到這個異常,那麼未處理的異常將由C++運行時處理,從而產生着名的「異常程序終止」消息(或類似的東西)。

+0

cout的操作符「是否需要分配內存?如果你內存不足,並且你在catch塊中再次用完內存,你會不會終止?因爲sizeof(事)是1我猜你會相當容量...... – AshleysBrain 2010-03-24 19:25:58

+0

@AshleysBrain:我不認爲'std :: cout <<'將分配任何內存。也許它需要一些堆棧空間,但這是保留的內存,所以不需要更多的堆空間需要IMO。 – AndiDog 2010-03-24 19:45:44

0

毫無疑問,您正在耗盡虛擬機。

+0

這取決於他的交換文件的大小。有了足夠大的交換空間(對於32位操作系統(例如XP)來說足夠簡單),您將在內存不足之前填滿每個進程的地址空間。 – 2010-03-24 19:00:36

1

您是否嘗試在調試中運行它?

在我的情況下(Win7)它給出了這個錯誤:該應用程序已經請求運行時以不尋常的方式終止它。請聯繫應用程序支持團隊以獲取更多信息。

但在調試模式下,它顯示操作員新引發了bad_alloc,這意味着內存不足。

+0

我最不喜歡的錯誤消息之一。如果它對用戶沒有意義,它不應該至少爲程序員提供一個提示嗎? – 2010-03-24 19:17:23

+0

程序員必須捕獲可能的異常 – Andrey 2010-03-24 19:25:06

3

這是CRT正在殺死你的程序。未處理異常(此處爲std :: bad_alloc)所需的行爲是對terminate()的調用。在MSVC實現中顯示「異常程序終止」消息,並調用abort()來終止程序。

相關問題