前言

上一篇博客记录了 tolua++ 将 c++类型,变量,函数,以及对象导出到 lua 的过程,这篇博客就接着记录一下 c++对象的内存回收以及c++对象数据和方法在lua中的扩展。


  1. 首先 tolua_reg_types() 在为 c++ 类型创建元表的时候,会在元表中创建一个key-value : __gc = tolua_gc_event

  2. 然后在 tolua_cclass ( ... , lua_CFunction col) 的过程中,会传入一个 c++ 对象的析构函数 , 以 .collector为key, 以析构函数为value 创建一个键值对放置于 c++ 类型元表中,即 type.mt.collector = col

  3. tolua++ 会为 c++对象的构造函数 创建相应的 new_local 方法,在 lua 层调用 new_local 的时候, 会触发 tolua_register_gc 即以c++指针为键,c++类型对应的元表为值,将这对key-value放于_R.tolua_gc中。

  4. 最后 lua 在垃圾回收的过程中,会触发 class_gc_event (lua_State* L) 来处理一个要被回收的 c++对象(userdata)。

    1. 首先检查 _R.tolua_gc 中是否有 以该userdata为key,以userdata的元表为value的键值对存在。
    2. 如果键值对存在于tolua_gc表中,就会在userdata的元表中取出.collector所对应的析构方法并且执行。
    3. 最后再以 _R.tolua_gc.userdata = nil 的方式将键值对移除gc表。这样就可以实现在lua中析构掉c++对象的内存。

lua扩展c++对象

Lua5.1

在lua 5.1中有 tolua.getpeer tolua.setpeer 两个方法可以在lua扩展c++对象。因为在lua中可以创建多个c++对象的实例,多个实例共享同一个c++类型所对应元表的里面设置的方法,但是多个实例的数据成员是相互独立,所以 tolua 就弄了一个peer表来存储c++在lua中的新增方法和数据。那么getpeer 和 setpeer方法就可以对这个peer表存取访问。

1 setpeer 一般用法: tolua.setpeer(c++_object,lua_table) 即将lua_table设置为c++_object的peer表 ,之后对实例对象进行get/set操作的时候首先会去遍历这个lua_table,然后再去遍历c++类对应的元表;那么这个lua_table中的数据和方法就属于当前实例对象自身的,与同一个c++类的其他实例无关。

2 getpeer 一般用法: tolua.getpeer(c++_object) 获取c++_object的peer表。

Lua低版本

lua版本小于5.1 ,是没有tolua.getpeer tolua.setpeer两个方法的, 低版本在lua中扩展c++对象的方式如下:

1 在注册表中准备一张 tolua_peers 的表 , 这张表以userdata为键,以c++对象在lua中新增的成员变量和方法的集合为值。

2 之后对实例对象进行get/set操作的时候会从tolua_peers表中找出userdata对应的成员变量与方法的集合,再从集合中寻找对应的成员变量或方法。

c++对象在lua层的生命周期与内容扩展的更多相关文章

  1. Java对象在JVM中的生命周期

          当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JVM会在合适的时 ...

  2. JAVA-JSP内置对象之session对象设置并获得session生命周期

    相关资料:<21天学通Java Web开发> session对象设置并获得session生命周期1.通过session对象的setMaxInactiveInterval()方法可以设置se ...

  3. 《深入Java虚拟机学习笔记》- 第7章 类型的生命周期/对象在JVM中的生命周期

    一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令 ...

  4. Autofac容器对象实例的几种生命周期类型

    实例范围决定了如何在同一服务的请求之间共享实例. 请注意,您应该熟悉生命周期范围的概念,以便更好地理解此处发生的情况. 当请求服务时,Autofac可以返回单个实例(单实例作用域),新实例(每个依赖作 ...

  5. spring总结之一(spring开发步骤、bean对象的管理、bean生命周期)

    ###spring 1.概念:开源,轻量级,简化开发的企业级框架. 开源:免费,发展快. 轻量级:占内存小. 简化开发:通用的功能封装,提高程序员的开发效率.--------------------- ...

  6. cocos2dx 3.x(场景(层)的生命周期)

    //进入当前层初第一步始化层调用 bool GameScence::init() { if( !void init() ) { returnfalse; } log("进入当前层初第一步始化 ...

  7. Hibernate 系列 06 - 对象在JVM中的生命周期

    引导目录: Hibernate 系列教程 目录 Java对象通过new命令进行创建,Java虚拟机(Java Virtual Machine,JVM)会为新的Java对象在内存中开辟一个新空间以存放次 ...

  8. lua关于参数生命周期的研究

    local num = 123 local str = "abc" local tb ={} 数字和字符串类型的值作为参数传递的时候,是复制值,2个独立的内存地址 table类型的 ...

  9. C#中Unity对象的注册方式与生命周期解析

    1.示例代码 请详细阅读 static void Main(string[] args) { { Console.WriteLine("----------全局设置----------&qu ...

随机推荐

  1. HDU1005 Number Sequence (奇技淫巧模拟)

    A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mo ...

  2. mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file (/opt/mysql/data/mysql.pid) 的解决方法

    出现问题的可能性 1.可能是/opt/mysql/data/数据目录mysql用户没有权限(修改数据目录的权限) 解决方法 :给予权限,执行  "chown -R mysql.mysql / ...

  3. 用git上传本地文件到github

    1.在自己的github账号下新建仓库--------得到github仓库地址 2.本地安装git---在将要克隆的文件夹下 右击点击Git Bash Here 3.输入命令 $ git clone ...

  4. Java钉钉开发_03_通讯录管理之 人员管理 和 部门管理

    一.本节要点 1.通讯录权限 ISV(应用服务商)默认无管理通讯录的权限,企业应用默认有所有通讯录权限. 2.数据传输格式—JSON 请参见: Java_数据交换_fastJSON_01_用法入门 二 ...

  5. 有关ActiveXObject的兼容性问题(浏览器的特有属性)

    这个问题还得从一开始时候学习有关javascript中有关对文件的一些操作. 对于每个前端的人应该都清楚有关File对象,其中包括多种方法,就不一一描述了,比如说她是通过FileSystemObjec ...

  6. 文本域、bootstrap-table显示以及MySQL三者间的换行符问题

    首先,今天在做项目的时候遇到的一个问题,如何实现文本输入换行以及在前台Bootstrap-table中显示也能够换行. 也许你马上就会想到说,用富文本编辑器,然而我们需要实现的只是文本输入以及换行功能 ...

  7. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  8. 【转】使用PowerDesigner的建模创建升级管理数据库

    使用PowerDesigner的建模创建升级管理数据库 PowerDesigner是一种著名的CASE建摸工具,最开始为数据库建模设计,即物理模型(Physical Data Model)用于生成数据 ...

  9. FPGA DDR3调试

    FPGA DDR3调试 Spartan6 FPGA芯片中集成了MCB硬核,它可以支持到DDR3.在Xilinx的开发工具Xilinx ISE中提供了MIG IP核,设计者可以用它来直接生成 DDR3 ...

  10. SpringAware

    哈哈,终于把分布式的课程演讲给混过去了,下面开始随便自己学点东西. 正题:SpringAware--------在实际项目中,用到spring容器的本省功能资源,这是Bean必须意识到Spring容器 ...