第29章 资源管理

在前面一章介绍的数组实现方法,我们不必担心如何管理资源,只需要分配内存。每一个表示数组的userdatum都有自己的内存,这个内存由Lua管理。当数组变为垃圾(也就是说,当程序不需要)的时候,Lua会自动收集并释放内存。

生活总是不那么如意。有时候,一个对象除了需要物理内存以外,还需要文件描述符、窗口句柄等类似的资源。(通常这些资源也是内存,但由系统的其他部分来管理)。在这种情况下,当一个对象成为垃圾并被收集的时候,这些相关的资源也应该被释放。一些面向对象的语言为了这种需要提供了一种特殊的机制(称为finalizer 或者析构器)。Lua__gc元方法的方式提供了finalizers。这个元方法只对userdata类型的值有效。当一个userdatum将被收集的时候,并且usedatum有一个__gc域,Lua会调用这个域的值(应该是一个函数):以userdatum作为这个函数的参数调用。这个函数负责释放与userdatum相关的所有资源。

为了阐明如何将这个元方法和API作为一个整体使用,这一章我们将使用Lua扩展应用的方式,介绍两个例子。第一个例子是前面已经介绍的遍历一个目录的函数的另一种实现。第二个例子是一个绑定ExpatExpat开源的XML解析器)实现的XML解析器。


相关链接:
lua程序设计目录 - 中国lua开发者 - lua论坛