nlib
nn::nlib::exi::ExiAllocator クラスfinal

XMLパーサーが内部で利用するアロケータです。ユーザーが利用することもできます。 [詳解]

#include "nn/nlib/exi/ExiAllocator.h"

静的公開メンバ関数

static bool Test (size_t nbytes) noexcept
 nBytes のメモリがアロケート可能かどうかをテストします。 [詳解]
 
static size_t GetPos () noexcept
 割り当て済みメモリのサイズを返します。 [詳解]
 
static bool IsOutOfMemory () noexcept
 以前のメモリアロケートが失敗したかどうかを調べます。 [詳解]
 
static ExiAllocatorEx GetAllocator () noexcept
 スレッド毎のExiAllocatorExオブジェクトを返します。
 
初期化と終了処理
static errno_t Init (void *p, size_t size) noexcept
 アロケータを初期化します。 [詳解]
 
static void * Finalize () noexcept
 アロケータの利用を終了します。 [詳解]
 
static void Reset () noexcept
 アロケータをリセットします。アロケータは初期化直後の状態になります。
 
メモリの割り当てと解放
static void * Alloc (size_t nbytes) noexcept
 アロケータからnBytes のメモリを割り当てます。 [詳解]
 
static void * Realloc (void *ptr, size_t from_nbytes, size_t nbytes) noexcept
 アロケートされたメモリを拡張する場合に呼び出されることがあります。 [詳解]
 
static void Dealloc (void *p) noexcept
 メモリをデアロケートしたときに呼び出されます。 [詳解]
 

詳解

XMLパーサーが内部で利用するアロケータです。ユーザーが利用することもできます。

説明
XMLパーサーはユーザーが最初に与えたメモリの範囲内で動作します。 これは、不正なデータ(長すぎる要素名など)が与えられた場合等にシステム全体を不安定にしてしまうようなことにならないようにするためです。 また、スレッド毎に別のメモリでアロケータを初期化する必要があります。 同じスレッドであれば、どのXMLリーダーやXMLライターからも同一のメモリ空間からメモリを取得しているので、ExiAllocator::Reset()等を利用する際には注意が必要です。
以下は初期化と終了処理のコード例です。
unsigned char buf[SIZE];
// スレッド毎に別々のメモリで初期化する必要があります。
ExiAllocator::Init(&buf[0], SIZE);
// ... XMLパーサーを利用 ...

ExiAllocator.h56 行目に定義があります。

関数詳解

§ Alloc()

nn::nlib::exi::ExiAllocator::Alloc ( size_t  nbytes)
staticnoexcept

アロケータからnBytes のメモリを割り当てます。

引数
[in]nbytesアロケートするメモリのサイズ
戻り値
割り当てられたメモリのアドレス。失敗した場合はNULL

§ Dealloc()

nn::nlib::exi::ExiAllocator::Dealloc ( void *  p)
staticnoexcept

メモリをデアロケートしたときに呼び出されます。

引数
[in]pデアロケートするメモリの先頭アドレス

§ Finalize()

nn::nlib::exi::ExiAllocator::Finalize ( )
staticnoexcept

アロケータの利用を終了します。

戻り値
初期化時に与えたメモリブロックのポインタ
説明
アロケータの利用を終了し、初期化以前の状態に戻します。 exiライブラリを利用したスレッド毎に呼び出す必要があります。

§ GetPos()

nn::nlib::exi::ExiAllocator::GetPos ( )
staticnoexcept

割り当て済みメモリのサイズを返します。

戻り値
割り当て済みメモリのサイズ

§ Init()

nn::nlib::exi::ExiAllocator::Init ( void *  p,
size_t  size 
)
staticnoexcept

アロケータを初期化します。

引数
[in]pメモリブロックの先頭へのポインタ
[in]sizeメモリブロックのサイズ
戻り値
成功ならば0
説明
アロケータにメモリを割り当て初期化します。 スレッド毎に別々のメモリを割り当てて初期化する必要があります。
exiライブラリはそれぞれのスレッドに割り当てられたメモリを利用して動作することになります。 従って、XMLパーサーの同一インスタンスを複数のスレッドで利用することはできません。

§ IsOutOfMemory()

nn::nlib::exi::ExiAllocator::IsOutOfMemory ( )
staticnoexcept

以前のメモリアロケートが失敗したかどうかを調べます。

戻り値
メモリのアロケートに失敗していればtrue

§ Realloc()

nn::nlib::exi::ExiAllocator::Realloc ( void *  ptr,
size_t  from_nbytes,
size_t  nbytes 
)
staticnoexcept

アロケートされたメモリを拡張する場合に呼び出されることがあります。

引数
[in]ptr拡張されるメモリの先頭アドレス
[in]from_nbytes拡張前のアロケートされたメモリサイズ
[in]nbytes拡張後のメモリサイズ
戻り値
割り当てられたメモリのアドレス。失敗した場合はNULL
説明
C標準関数のreallocと違い、現在アロケートされているメモリのサイズを渡す必要があります。

§ Test()

nn::nlib::exi::ExiAllocator::Test ( size_t  nbytes)
staticnoexcept

nBytes のメモリがアロケート可能かどうかをテストします。

引数
[in]nbytesアロケートしようとするメモリのサイズ
戻り値
falseならばアロケート不可能
説明
falseを返した場合は以後のIsOutOfMemory()の呼び出しがtrueを返します。 Alloc()が失敗するかどうかを事前に知りたい場合に利用します。

このクラス詳解は次のファイルから抽出されました: