根據C++標準,當分配失敗時operator new
應該throw std::bad_alloc();
。爲什麼我不能在我的WinCE應用程序中獲得std :: bad_alloc?
爲了測試這種行爲,我想出了下面的代碼:
try
{
for (;;)
{
Big* p = new Big;
if (0 == p)
{
printf("nullptr");
break;
}
}
}
catch (std::bad_alloc&)
{
printf("exception");
}
的問題是,出乎意料的是,我得到nullptr
每次我在我的Windows Mobile 2003(Windows CE的4.2)運行此。
編譯器是針對ARM的Microsoft(R)C/C++優化編譯器版本14.00.60131,所以我認爲編譯器不符合The Standard的情況。
我也試圖手動throw std::bad_alloc()
內給出try
塊(和成功所以catch
部分應在衰竭new
的情況下觸發)。另一件事是set_new_handler()
,但也沒有工作。如果重要,我的Big
大小爲10MB。
那麼你能告訴我我失蹤了什麼嗎?爲什麼我不能得到std::bad_alloc
?
編輯1:我不是在尋找如何克服這一點,但爲什麼它首先發生的原因。
編輯2:我已經簡化程序,就像我可以,在我的旅途調試new
,並拆卸輸出我得到的是:
int* p = new int[10];
00011010 mov r0, #0x28
00011014 bl 00011040 <---- here is the call to operator new
00011018 str r0, [sp, #0xC]
0001101C ldr r3, [sp, #0xC]
00011020 str r3, [sp, #4]
00011024 ldr r3, [sp, #4]
00011028 str r3, p
operator new:
00011040 ldr r12, [pc] <----
00011044 ldr pc, [r12] <---- what are those?
00011048 andeq r3, r1, r0 <---- is it just that?
0001104C andeq r1, r1, r4, lsr #11 <---- nothing else to be seen...
00011050 streqd r2, [r1], -r0 <----
不應該有任何系統電話?它不應該更復雜嗎?任何人都可以幫助調查此問題嗎?
使用調試器來調試'新' – Abyx
可能性差的標準遵從性,因爲例外情況被認爲是低性能系統的兩項開支。 – 111111
假設'Big'沒有重載的'new'操作符,這肯定是不合格的。用'struct big2 {char big [10 * 1024 * 1024]; };'只是爲了確定。你可以考慮使用'new(std :: nothrow)Big'來代替,只是爲了提醒你這就是你得到的行爲。 –