Cプログラムにおけるメモリーの使用

プログラムはすべて、なんらかの形のメモリー割当てを行います。EssbaseAPIは、内部でメモリーを割り当てます。メモリーの一部は、呼出し元プログラムにポインタの形で戻されます。呼出し元プログラムも、メモリーを割り当てられ、メモリーはAPIへのポインタとして渡されます。異なるメモリー管理スキーム間の競合を避けるために、APIでは、アプリケーションでのメモリー管理を統合するために2つのメカニズムを提供します:

CのAPIのメモリー管理スキームの使用

APIは、メモリー管理関数EssAlloc()EssRealloc()およびEssFree()を提供します。これらの関数(およびすべての内部APメモリー割当て)は、ESS_INIT_T初期化構造体のAllocFuncReallocFuncおよびFreeFuncフィールドがポイントするメモリー割当てルーチンを呼び出します。これらのフィールドへNULLを渡すと、APIに付属のデフォルトの割当てルーチンを使用します。これは、対象プラットフォームに適したネイティブのメモリー・アプリケーション・ルーチンを使用します。

すべてのプットフォームによって呼び出されたネイティブのメモリー割当てルーチンは、C標準ライブラリ呼出しmalloc()realloc()およびfree()を呼び出します。C標準ライブラリ呼出しは、アウトラインAPIの操作に対応します。それは、通常の使用の間にメモリーの小さな割当てを多く使用します。GlobalRealloc()は、新規のバッファ領域をNULLへ初期化しますが、realloc()は初期化しません。

注:

Intel X86ベースのMicrosoft Windowsプラットフォーム用コンパイラを使用している場合に、APIでは大きいメモリー・モデルが排他的に使用されることにご注意ください。

メモリー管理スキームのカスタマイズ

APIのメモリー管理関数を呼び出さない場合、または、同じ割当てスキームをアプリケーション全体に一貫して使用する場合、APIが使用するメモリー管理関数の集合を独自に定義できます。これには、メモリーの割当て、再割当ておよび解放を行うカスタム関数を書き、その関数をAPIが利用できるようにします。通常、これらの関数は、ご使用のアプリケーション内で使用される、対応するメモリー管理関数を内部で呼び出します。

Cプログラムでのカスタム・メモリー管理関数の定義

プログラムで独自のカスタム・メモリー管理関数を定義するには、それらの関数を書き、API初期化構造体のAllocfuncReallocFuncおよびFreeFuncフィールドを設定して、カスタム関数をポイントしてから、EssInit()を呼び出します。これらの関数およびその引数には希望の名前を使用できますが、それらを宣言するには、次のフォームを使用する必要があります:

      ESS_FUNC_M CustomAlloc   (ESS_SIZE_T BufSize, ESS_PPVOID_T ppBuffer);
ESS_FUNC_M CustomRealloc (ESS_SIZE_T BufSize, ESS_PPVOID_T ppBuffer); 
ESS_FUNC_M CustomFree    (ESS_PVOID_T pBuffer);
   

このコードでは、フィールドは次のように定義されています:

その後、これらの3つの関数へのポインタを、初期化構造体のAllocFuncReallocFuncおよびFreeFuncフィールドに割り当てます。次にこれをEssInit()関数に渡します(CのメインAPIの初期化を参照)。

注:

独自のカスタム・メモリー管理関数を定義するには、構造体の3つのすべてのフィールドに対して関数を作成し、割り当てる必要があります。

自身のカスタム・メモリー管理関数を定義した後は、そのアプリケーション内でデフォルトのAPIメモリー管理は使用できません。コード内からのEssbaseメモリー管理API関数、EssAlloc()EssRealloc()およびEssFree()の呼出しにより、ユーザーが定義した同等のカスタム関数が自動的に呼び出されるからです。ただし、同時にAPIを使用する他のアプリケーションには影響ありません。EssInit()を呼び出す各アプリケーションは、自身のカスタム関数を定義するか、デフォルトの関数を使用するかを独立して選択できます。

注意: カスタム・メッセージ関数の内部からEssbase API関数を呼び出そうとしないでください。ただし、メモリー管理API関数EssAlloc()EssRealloc()およびEssFree()は例外です。