C++ 標準によると、割り当てが失敗した場合operator new
。throw 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) で実行するたびに発生することです。
コンパイラは Microsoft (R) C/C++ Optimizing Compiler Version 14.00.60131 for ARM ですので、コンパイラが 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 <----
システムコールはありませんか?もっと複雑にすべきではありませんか?誰でもこれを調査するのを手伝ってもらえますか?