lua_Alloc
typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
The type of the memory-allocation function used by Lua states. The allocator function must provide a functionality similar to realloc
, but not exactly the same. Its arguments are ud
, an opaque pointer passed to lua_newstate
; ptr
, a pointer to the block being allocated/reallocated/freed; osize
, the original size of the block or some code about what is being allocated; and nsize
, the new size of the block.
When ptr
is not NULL
, osize
is the size of the block pointed by ptr
, that is, the size given when it was allocated or reallocated.
When ptr
is NULL
, osize
encodes the kind of object that Lua is allocating. osize
is any of LUA_TSTRING
, LUA_TTABLE
, LUA_TFUNCTION
, LUA_TUSERDATA
, or LUA_TTHREAD
when (and only when) Lua is creating a new object of that type. When osize
is some other value, Lua is allocating memory for something else.
Lua assumes the following behavior from the allocator function:
When nsize
is zero, the allocator must behave like free
and return NULL
.
When nsize
is not zero, the allocator must behave like realloc
. The allocator returns NULL
if and only if it cannot fulfill the request. Lua assumes that the allocator never fails when osize >= nsize
.
Here is a simple implementation for the allocator function. It is used in the auxiliary library by luaL_newstate
.
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { (void)ud; (void)osize; /* not used */ if (nsize == 0) { free(ptr); return NULL; } else return realloc(ptr, nsize); }
Note that Standard C ensures that free(NULL)
has no effect and that realloc(NULL,size)
is equivalent to malloc(size)
. This code assumes that realloc
does not fail when shrinking a block. (Although Standard C does not ensure this behavior, it seems to be a safe assumption.)
Please login to continue.