根据C++标准,当内存分配失败时operator new 应该抛出std::bad_alloc();。
为了测试这种行为,我想到了以下代码:
问题是,每次在我的Windows Mobile 2003(Windows CE 4.2)上运行时,不期望地获取
编译器是Microsoft(R)C/C++优化编译器版本14.00.60131,因此我认为这不是编译器与标准不兼容的情况。
我还尝试在给定的
那么你能告诉我我错过了什么吗?为什么我没有得到
为了测试这种行为,我想到了以下代码:
try
{
for (;;)
{
Big* p = new Big;
if (0 == p)
{
printf("nullptr");
break;
}
}
}
catch (std::bad_alloc&)
{
printf("exception");
}
问题是,每次在我的Windows Mobile 2003(Windows CE 4.2)上运行时,不期望地获取
nullptr
。编译器是Microsoft(R)C/C++优化编译器版本14.00.60131,因此我认为这不是编译器与标准不兼容的情况。
我还尝试在给定的
try
块中手动throw std::bad_alloc()
(并成功),因此在new
失败的情况下应该触发catch
部分。另一件事是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 <----
难道没有系统调用吗?这不应该更复杂吗?有人能帮忙调查一下吗?
Big
没有重载new
运算符,那么它肯定不符合规范。可以尝试使用struct Big2 { char big[10*1024*1024]; };
来确认。你可以考虑使用new (std::nothrow) Big
,以提醒自己这就是你得到的行为。 - Steve Jessop