第29章 资源管理 |
在前面一章介绍的数组实现方法,我们不必担心如何管理资源,只需要分配内存。每一个表示数组的userdatum都有自己的内存,这个内存由Lua管理。当数组变为垃圾(也就是说,当程序不需要)的时候,Lua会自动收集并释放内存。
生活总是不那么如意。有时候,一个对象除了需要物理内存以外,还需要文件描述符、窗口句柄等类似的资源。(通常这些资源也是内存,但由系统的其他部分来管理)。在这种情况下,当一个对象成为垃圾并被收集的时候,这些相关的资源也应该被释放。一些面向对象的语言为了这种需要提供了一种特殊的机制(称为finalizer 或者析构器)。Lua以__gc元方法的方式提供了finalizers。这个元方法只对userdata类型的值有效。当一个userdatum将被收集的时候,并且usedatum有一个__gc域,Lua会调用这个域的值(应该是一个函数):以userdatum作为这个函数的参数调用。这个函数负责释放与userdatum相关的所有资源。
为了阐明如何将这个元方法和API作为一个整体使用,这一章我们将使用Lua扩展应用的方式,介绍两个例子。第一个例子是前面已经介绍的遍历一个目录的函数的另一种实现。第二个例子是一个绑定Expat(Expat开源的XML解析器)实现的XML解析器。