内存安全的 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
Posted by: tonyhu | (8) April 4, 2014 03:57 PM
Posted by: 網站架設 | (7) April 3, 2014 04:33 AM
Posted by: dwing | (6) April 2, 2014 03:04 PM
Posted by: Selector | (5) April 2, 2014 10:28 AM
Posted by: 竿子 | (4) April 2, 2014 10:21 AM
Posted by: 宁波 | (3) April 1, 2014 11:10 PM
Posted by: tingliang | (2) April 1, 2014 10:08 PM
Posted by: G0561 | (1) April 1, 2014 09:36 PM