Skip to content

lua_Alloc

Luaステートによって使用されるメモリ割り当て関数の型です。

[-0, +0, -]

c
typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);

説明

Luaステートによって使用されるメモリ割り当て関数の型です。割り当て関数はreallocに似た機能を提供する必要がありますが、全く同じではありません。その引数はudで、lua_newstateに渡される不透明なポインタです。ptrは、割り当て/再割り当て/解放されるブロックへのポインタです。osizeはブロックの元のサイズ、nsizeはブロックの新しいサイズです。ptrosizeがゼロの場合、かつその場合に限りNULLです。nsizeがゼロのとき、割り当て関数はNULLを返す必要があります。osizeがゼロでない場合、ptrを指すブロックを解放する必要があります。nsizeがゼロでないとき、割り当て関数は要求を満たせない場合にのみNULLを返します。nsizeがゼロでなく、osizeがゼロのとき、割り当て関数はmallocのように振る舞うべきです。nsizeosizeがゼロでない場合、割り当て関数はreallocのように振る舞います。Luaは、osize >= nsizeのとき割り当て関数が決して失敗しないと仮定しています。

こちらは割り当て関数のシンプルな実装です。これは補助ライブラリによってluaL_newstateで使用されます。

c
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
  (void)ud;  (void)osize;  /* 未使用 */
  if (nsize == 0) {
    free(ptr);
    return NULL;
  }
  else
    return realloc(ptr, nsize);
}

このコードはfree(NULL)が効果を持たないことと、realloc(NULL, size)malloc(size)に等しいことを前提としています。ANSI Cは両方の振る舞いを保証します。

サンプルコード

c
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
  (void)ud;  (void)osize;  /* 未使用 */
  if (nsize == 0) {
    free(ptr);
    return NULL;
  }
  else
    return realloc(ptr, nsize);
}

このコードは、free(NULL)が効果を持たないことと、realloc(NULL, size)malloc(size)に等しいことを前提としています。

互換性

  • Lua5.1

関連項目

  • lua_newstate