1.46 例外用の緊急時バッファメモリ

ヒープが不足したときに std::bad_alloc 例外をスローするために使用する緊急時メモリを割り当てるかどうかを選択できます。

緊急時メモリを割り当てるには、シンボル __ARM_exceptions_buffer_required をリンクに含める必要があります。次に、例外システムの初期化の一部として __ARM_exceptions_buffer_init() が呼び出されます。デフォルトではシンボルは含まれていません。
以下のルーチンは、例外用の緊急時バッファを管理します。
  • extern "C" void *__ARM_exceptions_buffer_init()
    緊急時バッファメモリを割り当てるために、実行時一度呼び出されます。ルーチンからは、緊急時バッファメモリのポインタ、またはメモリが割り当てられない場合には NULL が返されます。
  • extern "C" void *__ARM_exceptions_buffer_allocate(void *buffer, size_t size)
    例外がスローされる直前に、例外オブジェクトの割り当てに利用できるヒープメモリが不足している場合に呼び出されます。 buffer は、__ARM_exceptions_buffer_init() によって直前に返される値です。また、そのルーチンが呼び出されなかった場合は NULL が返されます。__ARM_exceptions_buffer_allocate() は、8 バイト境界で整列される size バイトのメモリへのポインタを返しますが、割り当てることができない場合は NULL を返します。
  • extern "C" void *__ARM_exceptions_buffer_free(void *buffer, void *addr)
    __ARM_exceptions_buffer_allocate() によって割り当てられた可能性のあるメモリを解放するために呼び出されます。 buffer は、__ARM_exceptions_buffer_init() によって直前に返される値です。また、そのルーチンが呼び出されなかった場合は NULL が返されます。このルーチンは、渡されたアドレスが緊急時バッファメモリから割り当てられたものであるかどうかを判断します。緊急時バッファメモリによって割り当てられたメモリと判断された場合には、このメモリを適切に解放してから NULL 以外の値を返します。 addr のメモリが __ARM_exceptions_buffer_allocate() によって割り当てられたものではない場合は、ルーチンは NULL を返します。
これらのルーチンのデフォルト定義はイメージにありますが、独自の定義を設定してライブラリに含まれているデフォルトを上書きすることもできます。デフォルトのルーチンでは、1 つの std::bad_alloc 例外オブジェクトしか入らない容量が予約されます。緊急時バッファが必要ない場合は、これらのルーチンをすべて再定義して、NULL のみを返すのが間違いのない方法です。
関連する概念
1.41 新しい実行環境に合わせた C ライブラリのカスタマイズ
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.