下面的C++程序我的Windows XP機器崩潰,並留言「異常程序終止」當我的C++程序運行內存不足時,它到底如何終止?
class Thing {};
int main()
{
for (;;) new Thing();
}
我會說這是內存不足的問題,但我不知道的Windows快要到了極限。 Windows故意故意殺死它嗎?如果是這樣,它是如何決定的?
下面的C++程序我的Windows XP機器崩潰,並留言「異常程序終止」當我的C++程序運行內存不足時,它到底如何終止?
class Thing {};
int main()
{
for (;;) new Thing();
}
我會說這是內存不足的問題,但我不知道的Windows快要到了極限。 Windows故意故意殺死它嗎?如果是這樣,它是如何決定的?
你是對的這是一個內存不足的問題,導致你的程序結束。但不是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++運行時處理,從而產生着名的「異常程序終止」消息(或類似的東西)。
毫無疑問,您正在耗盡虛擬機。
這取決於他的交換文件的大小。有了足夠大的交換空間(對於32位操作系統(例如XP)來說足夠簡單),您將在內存不足之前填滿每個進程的地址空間。 – 2010-03-24 19:00:36
您是否嘗試在調試中運行它?
在我的情況下(Win7)它給出了這個錯誤:該應用程序已經請求運行時以不尋常的方式終止它。請聯繫應用程序支持團隊以獲取更多信息。
但在調試模式下,它顯示操作員新引發了bad_alloc,這意味着內存不足。
我最不喜歡的錯誤消息之一。如果它對用戶沒有意義,它不應該至少爲程序員提供一個提示嗎? – 2010-03-24 19:17:23
程序員必須捕獲可能的異常 – Andrey 2010-03-24 19:25:06
這是CRT正在殺死你的程序。未處理異常(此處爲std :: bad_alloc)所需的行爲是對terminate()的調用。在MSVC實現中顯示「異常程序終止」消息,並調用abort()來終止程序。
cout的操作符「是否需要分配內存?如果你內存不足,並且你在catch塊中再次用完內存,你會不會終止?因爲sizeof(事)是1我猜你會相當容量...... – AshleysBrain 2010-03-24 19:25:58
@AshleysBrain:我不認爲'std :: cout <<'將分配任何內存。也許它需要一些堆棧空間,但這是保留的內存,所以不需要更多的堆空間需要IMO。 – AndiDog 2010-03-24 19:45:44