前言

上一篇博客记录了 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. Andrew 机器学习课程笔记

    Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...

  2. poj 3484 Showstopper

    Showstopper Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2236   Accepted: 662 Descri ...

  3. JAVA 通过 Socket 实现 TCP 编程

    简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...

  4. JAVAscript学习笔记 jsDOM 第五节 (原创) 参考js使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Java_数据交换_fastJSON_01_用法入门

    一.用法 1.序列化—将Object转为Json对象 Object data=JSON.toJSON( MyObject ); 注:本文的Object可以是Map.List.javaBean等 需求: ...

  6. SQL命令语句小技巧

    1.[ ]的使用 当我们所要查的表是系统关键字或者表名中含有空格时,需要用[]括起来,例如新建了两个表,分别为user,user info,那么select * from user和select * ...

  7. C:\WINDOWS\system32\wmp.dll”受到“Windows 系统文件保护”

    在VC# 2005 中,要是打包的程序中包含了Windows Media Player 这个组件的话,在生成解决方案的过程中会提示出错:  "错误1,应将“wmp.dll”排除,原因是其源文 ...

  8. KICKSTART无人值守安装 - (字符界面操作)

    kickstart 部署 1.1 kickstart简介说明 1.1.1 pxe工作过程(图) 1.1.2 kickstart具体过程(图) 1.2 kickstart无人值守部署 1.2.1 系统环 ...

  9. springboot整合shiro

    请大家在看本文之前,先了解如下知识点: 1.Shiro 是什么?怎么用? 2.Cas 是什么?怎么用? 3.最好有Spring基础 可以先看看这两篇文章,按照这2篇文章的内容做一遍: Spring B ...

  10. python 小白(无编程基础,无计算机基础)的开发之路 day2

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...