メモリ確保・開放処理の管理クラスです。 [詳解]
#include <OnlineCore/src/Platform/Core/MemoryManager.h>
公開型 | |
typedef void(* | FreeFunction) (void *pMemory) |
メモリ解放関数の関数型です。 [詳解] | |
typedef void *(* | MallocFunction) (size_t stSize) |
メモリ確保関数の関数型です。 [詳解] | |
静的公開メンバ関数 | |
static void | SetBasicMemoryFunctions (MallocFunction fcnMalloc, FreeFunction fcnFree) |
NEXライブラリ内部で使用されるメモリ確保/解放関数を設定します。 [詳解] | |
メモリ確保・開放処理の管理クラスです。
NEXライブラリは内部で動的なメモリ確保を頻繁に行います。 デフォルトでは、NEXライブラリは標準のmalloc()/free()関数を利用してメモリ確保を行いますが、 SetBasicMemoryFunctions でメモリマネージャーを差し替えることが可能です。
差し替えるメモリマネージャーをスレッドセーフにするか、スレッドアンセーフにするかはアプリケーション側の 判断に委ねられますが、いくつか注意点があります。SetBasicMemoryFunctions() をご参照下さい。
typedef void*(* nn::nex::MemoryManager::MallocFunction) (size_t stSize) |
メモリ確保関数の関数型です。
stSize には確保するメモリサイズが渡されます。 返値には確保したメモリの先頭を指すポインタを指定してください。
[in] | stSize | 確保するメモリサイズ |
typedef void(* nn::nex::MemoryManager::FreeFunction) (void *pMemory) |
メモリ解放関数の関数型です。
pMemory には解放すべきメモリの先頭を指すポインタが渡されます。
[in] | pMemory | 解放すべきメモリの先頭を指すポインタ。 |
|
static |
NEXライブラリ内部で使用されるメモリ確保/解放関数を設定します。
NEXライブラリは、内部で動的なメモリ確保を頻繁に行いますが、 本関数でメモリマネージャーを差し替えることができます。
この関数を使用すると、NEXライブラリが使用するメモリマネージャーをデベロッパ独自のコードに 変更することができます。この関数はいつでも呼び出すことができますが、通常はNEXのオブジェクトが 作成される前に呼び出します。
差し替えるメモリマネージャーをスレッドセーフなものとするか、スレッドアンセーフなものとするかは アプリケーション側の判断に委ねられます。
もしNEXライブラリを非シングルスレッドモードで利用しているのであれば、差し替えるメモリマネージャーは スレッドセーフでなくてはなりません。
NEXライブラリをシングルスレッドモードで使用している場合であっても、アプリケーション側が マルチスレッド環境で動作し、NEXライブラリのオブジェクトを複数のスレッドから利用しているような場合は 注意が必要です。 NEXライブラリのオブジェクトを自動変数として使用する(オブジェクトをスタック上に作成する)ケースであっても、 オブジェクトの内部で動的なメモリ確保が実行されるケースもありますので、もしスレッドアンセーフな メモリマネージャーを使用する場合は、適切な排他制御が必要となります。
NEXライブラリ内部では、動的メモリ確保は必ず成功することを前提としたコードが記述されています。 そのため、必ず有効なメモリへのアドレスを返すように実装してください。 具体的には、以下のような実装をしていただく必要があります。
・予定してあるメモリ量を超えてメモリを確保したらライブラリをシャットダウンする。
・事前に数KB程度(正常にライブラリシャットダウンまで実行できるであろう量)のメモリをAllocしておき、Allocできなくなったらその数KBのメモリを解放する。その後ライブラリをシャットダウンする。
・予めメモリに十分余裕を持っておく(通信環境が悪くなった場合などでもメモリが足りなくなることがないように十分なデバッグを行なってください)。
[in] | fcnMalloc | ユーザー定義のメモリ確保関数。 |
[in] | fcnFree | ユーザー定義のメモリ解放関数。 |