解决luajit ffi cdata引用cdata的问题

使用luajit ffi会遇到cdata引用cdata的情况。官方说明是必须手动保存所有cdata的引用,否则会被gc掉。

ffi.cdef[[
    struct A { int id; };
    struct B { int id; struct A* a; };
]]

function createB()
    local a = ffi.new("struct A")
    local b = ffi.new("struct B")
    b.a = a
    return b
end

比如上述代码是不能正常运行的。你比如同时持有a和b。这样使用起来非常不方便,一旦c struct层级多了,太麻烦。我上github上问了这个问题,luajit的作者Mike给我提供了几个解决办法。我使用了第2种方法:把所有cdata放到一个chunk里,这样只需要持有一个chunk即可。另外我又实现了一个纯lua的方法,原理是建立一个与c struct结构相同的lua table,把引用都保存到lua table里。代码在这里

原文地址:https://www.cnblogs.com/vkensou/p/12245025.html

时间: 2024-12-30 04:55:20

解决luajit ffi cdata引用cdata的问题的相关文章

luaJIT FFI Library

LuaJIT FFI Library The FFI library allows calling external C functions and using C data structures from pure Lua code. The FFI library largely obviates the need to write tedious manual Lua/C bindings in C. No need to learn a separate binding language

利用delegate来解决类之间相互引用问题(引用死锁)

类之间相互引用--类A中需要调用类B中的方法,同时,类B中又要调用类A中的方法.(也被称为引用死锁,通常会出现编译错误). 解决方法是,在类A中引用类B,并使类A成为类B的delegate,这样在类A中就可以调用类B中的方法,而在类B中可以设一个delegate属性,(这个delegate其实就是类A)就可以用[delegate msg]的方式来调用类A中的方法了. 具体实现如下: ** classA.h : @interface ClassA<ClassBDelegate> { ClassB

用浅/深拷贝、和HTML5方法解决js对象的引用的问题

先来看一个例子 例一: var a=[1,2,3]; var b=a; b.push(4); alert(b);//1,2,3,4 alert(a);//1,2,3,4 var a=[1,2,3]; var b=a; b=[1,2,3,4] alert(b);//1,2,3,4 alert(a);//1,2,3 这两种方法得出的结果是不一样的. 第一个程序,是对象的引用, 把a的值附给b,a与b之间是引用的关系,当两者之间是引用的关系时,改变任一变量,都会影响另一个变量. 第二个程序,只是对b的

getActionBar()为null的解决方法总结(引用他人)

最近在看android actionBar的使用,环境为AndroidStudio,建一个简单的工程,功能为:两个按钮,一个单击用于显示actionbar,一个用于隐藏actionbar.默认actiobar显示.理想状况如下图所示: 建好工程并运行,发现actionbar默认不显示(不显示上图所示的hello部分),如下图所示: 且单击"显示actionBar"的按钮后出现异常:如下图所示: 发现,是java.lang.NullPointerException引起的,到代码里面发现代

weakSelf 运用 strongSelf来解决block的循环引用

SDWebImage 中有一段源码: #if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication"); BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]; if (hasApplication &&am

解决vs2017不能添加引用问题

c# 添加引用时报错:"未能正确加载"ReferenceManagerPackage"包"的解决方法 在添加应用的时候,右键点击"引用",选择"添加引用"后,会提示"**未能正确加载ReferenceManagerPackage包**"之类的信息.具体的解决方法如下: (1)点击开始按钮,在搜索框中输入"Developer Command Prompt for VS 2017",选择这个

解决OBJC_CLASS_$_MBProgressHUD无法引用的问题(转载)

Undefined symbols for architecture i386: "_OBJC_CLASS_$_MBProgressHUD", referenced from: objc-class-ref in ViewController.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocat

C#:解决WCF中服务引用 自动生成代码不全的问题。

问题描述: 如下图:打叉的部分是引用不成功的部分 ,在web.config文件中没有自动添加其引用代码. 英文解释 在服务引用选择自己的项目的程序集就行了,如下图: 特别注意:这些程序集一定要在自己的项目中,也就是说,你的web引用的程序集如果有感叹号,那样也不行.

解决ARC的循环引用问题

看看下面的程序有什么问题: BNRItem.h @interface BNRItem : NSObject @property (nonatomic, strong) BNRItem *containedItem; @property (nonatomic, strong) BNRItem *container; ... @end BNRItem.m #import "BNRItem.h" @implementation BNRItem ... - (void)setContained