##### Shinobi Library - メモリマネージメント関数

# syMallocChangeIF

malloc系関数の入れ替え

### 書式

> `SYS_MALLOC_IF *syMallocChangeIF( *mallocIF )
> SYS_MALLOC_IF *mallocIF
> `

### 引数

> mallocIF | 変更するmalloc等の関数のアドレスを設定した構造体のポインタ

### 戻り値

> 変更前のmalloc等の関数のアドレスを設定した構造体のポインタ

### 解説

> メモリを確保する関数 syMalloc(malloc)、syFree(free)などの実体をユーザーの作成した関数に置き換えます。

> セガライブラリの関数の中でsyMalloc()を使用している関数からの呼び出しも置き換えられますので、すべての syMalloc()、 malloc()、(C++のnew演算子)のときに使用されるメモリの確保の関数を置き換えます。

### 用例

>     SYS_MALLOC_IF myMallocIF;   /* malloc library to be changed */
>     SYS_MALLOC_IF *oldMallocIF; /* malloc library before syMallocChangeIF */

>     myMallocIF.malloc = myMalloc;
>     myMallocIF.free = myFree;
>     myMallocIF.realloc = myRealloc;
>     myMallocIF.calloc = myCalloc;
>     oldMallocIF = syMallocChangeIF(&myMallocIF);

### 備考

> (1)SYS_MALLOC_IF構造体

> この関数に渡す引数の構造体は、そのインターフェース（置き換えた関数）を使用する間は常に存在し、有効である必要があります。通常はグローバル変数かスタティック変数として定義してください。

> (2)アライメント

> syMalloc()などの関数の返すアドレスは、32 バイト 境界にアライメントされていることが保証されている必要があるため、syMallocChangeIF()関数で置き換える関数もそれを満たして下さい。 （ただし、セガライブラリ関数が実行されるときにだけ再度 syMallocChagneIF()関数を呼び出して syMalloc()関数を使用してもとに戻す場合には、その必要はありません。）

> (3)ヘッダ領域

> 日立 SHC++ を使用するときには、SHC++ がメモリブロックヘッダ内に予約領域を必要とするため、次のような制限があります。 具体的には、malloc()関数が返すアドレスを Uint32 *ptr とした場合に ptr-1, と ptr-2 の領域をSHC++ が予約しているために、ユーザの malloc ライブラリはこの領域を空けておく必要があります。 つまり、確保したメモリ領域の前方 8 バイトを空けておく必要があります。

> (4)malloc と free の関係

> 現在の syMallocChangeIF は、free を行うときには、malloc が行われたときと同じ malloc ライブラリが設定されている必要があります。

### 参照

> syCalloc() | メモリの確保
> syFree() | メモリ領域の開放
> syMalloc() | メモリの確保
> syRealloc() | 確保したメモリのサイズ変更

syMallocChangeIF

COPYRIGHT © SEGA ENTERPRISES, LTD., 1998-2000