MemoryManager メモリーマネジャー ある領域中のメモリを一括して管理する。つまり、どの領域が使用中でどの領域が 未使用かということを常に把握している。このクラスを使うことで、確実に未使用の 領域を得ることができる。 MemoryManagerはメモリ領域をMemoryEntry構造体を使用して管理している。 先頭にMemoryEntry型の情報を入れてメモリ領域としている。先頭の情報には 次のMemoryEntryへのアドレスと領域の大きさが入っている。 この辺のことは図に表したほうがはるかにわかりやすい。 コンストラクタ 特になし。 グローバル変数として定義されることもあるので コンストラクタでの初期化は想定されていない。 initialize(dword start, dword end); 初期化関数。プライベートメンバ変数を初期化している。 freelist_ ・・・引数で与えられた領域をそのままフリー領域として定義している。 usedlist_ ・・・この段階ではまだ使用されている領域はないのでNULLになっている。 start_ ・・・引数で与えられたstart。 end_ ・・・引数で与えられたend。 allocate(dword size); 指定されたバイト数分のメモリ領域を確保する。この処理は次のステップを行う。 1)指定されたバイト数にメモリ領域のヘッダーのサイズを加えて、実際に確保される 大きさを計算する。これが realSize になる。 2)未使用のメモリ領域のリストをたどって realSize の大きさのメモリが入る メモリ領域を探し出す。なければ NULL を返す。 3)探し出したメモリ領域(current)の大きさが realSize と同じなら、そのメモリ領域を 未使用のメモリ領域のリストから切り離して使用済みのメモリリストに加える。 メモリ領域の大きさが realSize より大きければ分割して前のほうを使用して、 後ろのほうを未使用リストに加える。 free(void* address); allocate(dword size)で確保したメモリを解放する。 まず、MemoryEntryへのポインタを得て、それからメモリ領域を未使用にして、 適当なところと結合させる。