#
2 メモリインタフェース

Python ヒープに対してメモリを確保したり解放したりするために、 以下の関数セットが利用できます。これらの関数は ANSI C 標準に 従ってモデル化されていますが、0 バイトの領域を要求した際の 動作についても定義しています:

void* `PyMem_Malloc`( | size_t n)

  n バイトをメモリ確保し、確保されたメモリを指す `void*` 型のポインタを返します。確保要求に失敗した場合には `NULL` を 返します。 0 バイトをリクエストすると、可能ならば独立した非`NULL` の ポインタを返します。このポインタは `PyMem_Malloc(1)` を代わりに呼んだときのようなメモリ領域を指しています。 確保されたメモリ領域はいかなる初期化も行われていません。

void* `PyMem_Realloc`( | void *p, size_t n)

  p が指しているメモリブロックを n バイトにサイズ変更 します。メモリの内容のうち、新旧のサイズのうち小さい方までの 領域は変更されません。p が `NULL`ならば、この関数は `PyMem_Malloc(n)` と等価になります; それ以外の場合で、n がゼロに等しければ、 メモリブロックはサイズ変更されますが、解放されず、非 `NULL`の ポインタを返します。p の値を`NULL`にしないのなら、 以前呼び出した `PyMem_Malloc()` や `PyMem_Realloc()` の返した値でなければなりません。

void `PyMem_Free`( | void *p)

  p が指すメモリブロックを解放します。p は 以前呼び出した `PyMem_Malloc()` や `PyMem_Realloc()` の返した値でなければなりません。 それ以外の場合や、すでに `PyMem_Free(p)` を 呼び出した後だった場合、未定義の動作になります。 p が `NULL`なら、何も行いません。

以下に挙げる型対象のマクロは利便性のために提供されているものです。 TYPE は任意の C の型を表します。

TYPE* `PyMem_New`( | TYPE, size_t n)

  `PyMem_Malloc()` と同じですが、 `(n * sizeof(TYPE))` バイトのメモリを確保します。 `TYPE*` に型キャストされたポインタを返します。 メモリには何の初期化も行われていません。

TYPE* `PyMem_Resize`( | void *p, TYPE, size_t n)

  `PyMem_Realloc()` と同じですが、 `(n * sizeof(TYPE))` バイトにサイズ変更されたメモリを 確保します。 `TYPE*` に型キャストされたポインタを返します。

void `PyMem_Del`( | void *p)

  `PyMem_Free()` と同じです。

上記に加えて、C API 関数を介することなく Python メモリ操作関数を 直接呼び出すための以下のマクロセットが提供されています。 ただし、これらのマクロは Python バージョン間でのバイナリ互換性を 保てず、それゆえに拡張モジュールでは撤廃されているので注意してください。

`PyMem_MALLOC()`、 `PyMem_REALLOC()`、 `PyMem_FREE()`。

`PyMem_NEW()`、 `PyMem_RESIZE()`、 `PyMem_DEL()`。