« 在不同的 lua vm 间共享 Proto | 返回首页 | lua-conf 让配置信息在不同的 lua 虚拟机间共享 »

内存安全的 Lua api 调用

Lua 的 API 设计的非常精良,整个 lua 核心库把内存管理都托管给了 lua_Alloc 这个用户注入的函数。任何时候在发生内存不足,lua 的 api 都可以正确处理异常。

考虑一下 lua_newtable 或是 lua_pushlstring 这些 api ,它们都需要创建新的 gcobject ,这些时候如果发生 lua_Alloc 分配不出内存怎么办?这些 api 可都是无返回值的。

lua 的行为是:抛出一个内存错误,如果外界没能捕获这个错误,则触发 panic 函数。

在编写将 lua 嵌入到宿主程序中的一个常见的错误是:

先用 lua_newstate 创建出一个 lua 虚拟机,然后直接调用 luaL_openlibs 等函数初始化它。如果你希望你的代码足够严谨,就必须了解,初始化的过程是有可能遇到内存申请不到的情况的。

正确的做法在 lua 自带的解释器实现中有一个很好的范例:你可以写一个 lua c function ,在里面做后续对 lua_State 的操作。在 lua_newstate 后,立刻 lua_pcall 这个 C 函数,而不是直接调用它。这样,所有的内存异常都会被这次 pcall 捕获住。

btw, 早期版本的 lua 有一个 lua_cpcall 函数,自从 lua 支持 light c function 后就去掉了这个 api 。

整个系统中都把内存不足的问题考虑清楚是件需要特别小心的事情。只要有一个角落没写对就前功尽弃。代码也会复杂很多。所以我自己的大部分代码都放弃了处理这个问题,包括如非必要,不检查 malloc 的返回值等。因为我了解我的程序的应用环境,一旦发生内存不足,系统很难继续工作下去。

与其把代码搞的过于复杂,还不一定面面俱到,不如直接放弃解决这个问题。交给操作系统去做就好,如果进程因为内存不足而崩溃也只好认了吧。

Comments

我开始学习lua了,感觉不错
好文章,受教了
lua语法简单,纯粹,易懂,更贴近动态脚本类语言的本质 lua体积小,API精简,易于粘合到其它语言 lua源代码少,易于读源码来学习原理和深入使用 lua是纯ANSI-C的子集实现,跨平台最容易 lua有在动态语言里性能数一数二的JIT实现
我也想知道為什麼選擇lua,不管是理性或感性上的
哈哈 得到的结论不错~
lua比pathon简单
最后一句的处理方法,很像Erlang中的就让它崩溃的思想。
感觉python 也很强悍,为什么你那么喜欢lua 呢 ?

Post a comment

非这个主题相关的留言请到:留言本