Lua2.4 内存分配 mem.c

本文深入探讨了Lua语言中的内存管理机制,包括内存分配、释放及重新分配等操作的具体实现方式,并对其中的一些错误处理机制进行了说明。

先看看头文件里的定义,定义了一些出错信息,几个内存管理接口,和宏。
几个宏的定义也是用到了内存分配的几个接口。newvector 在之前的词法分析里已经出现了。
几个接口,看函数名字比较容易看出来它的作用。下面看一下它们各自的实现:

void luaI_free (void *block)
{
  if (block)
  {
    *((int *)block) = -1;  /* to catch errors */
    free(block);
  }
}

释放内存。设置 -1 的那个地方是为了捕获错误,改变被释放内存的第一个地方的内容,以防在释放内存之后误用野指针可能带来其它的莫名其妙的错误。

void *luaI_malloc (unsigned long size)
{
  void *block = malloc((size_t)size);
  if (block == NULL)
    mem_error();
  return block;
}

调用 malloc 分配内存,如果分配不成功,出错。
返回成功分配的内存。

void *luaI_realloc (void *oldblock, unsigned long size)
{
  void *block = oldblock ? realloc(oldblock, (size_t)size) :
                           malloc((size_t)size);
  if (block == NULL)
    mem_error();
  return block;
}

调用 relloc 分配内存,如果 oldblock 为空,同 malloc。
分配不成功,则出错。
返回成功分配的内存。

int luaI_growvector (void **block, unsigned long nelems, int size,
                       char *errormsg, unsigned long limit)
{
  if (nelems >= limit)
    lua_error(errormsg);
  nelems = (nelems == 0) ? 20 : nelems*2;
  if (nelems > limit)
    nelems = limit;
  *block = luaI_realloc(*block, nelems*size);
  return (int) nelems;
}

重新分配数组。内部调用 luaI_realloc 来重新分配内存。
如果需要分配的元素个数大于所限制的内存数,出错。
如果需要分配的元素个数为 0,设置其为 20 个,如果非 0,扩大一倍。
如果需要分配的元素个数大于限制,设置其为限制数。
调用 luaI_realloc 重新分配内存。
返回实际分配的个数。

void* luaI_buffer (unsigned long size)
{
  static unsigned long buffsize = 0;
  static char* buffer = NULL;
  if (size > buffsize)
    buffer = luaI_realloc(buffer, buffsize=size);
  return buffer;
}

分配一个缓冲区 buffer,内部调用 luaI_realloc 分配内存。
如果新的 buffer 的 size 小于原来的 buffer size ,什么也不做,直接返回原来的 buffer.
如果新的 buffer 的 size 大于原来 buffer 的 size,重新分配一个 buffer,返回它。分配内存时调用的依旧是 luaI_realloc。

----------------------------------------
到目前为止的问题:
lex.c
> lua_createstring 是什么? TaggedString 是个什么数据结构?
> luaI_codedebugline 是什么? 调试相关信息有哪些?

inout.c
> luaI_createfixedstring 是什么? 那个 TaggedString 是个什么数据结构?

luac.c
> do_compile 里的 TFunc 是什么?那个初始化 luaI_initTFunc 是什么?
> lua_parser 是什么? do_dump 方法里调的那几个方法又分别是干什么的?
----------------------------------------

转载于:https://my.oschina.net/xhan/blog/324763

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值