免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1999 | 回复: 5
打印 上一主题 下一主题

[C] lua和C交互, 各位大神问个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-16 16:01 |只看该作者 |倒序浏览
C调用lua函数,取到字符串返回值后不立即处理就返回lua,然后异步的处理。
   1.想问下,lua那边传完之后得到结果了会把内存回收吗?
   2.当我异步处理的时候,存入的字符串还在不?

  我现在遇到的问题就是字符串打印出来是乱码,10000条里有1000多条是乱码,是什么情况

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2015-10-16 17:39 |只看该作者
lua传过来的string是局部作用域,并且在传给你之后没再引用就回收了
C里得到的只是个指针,可以malloc memcpy(不用strcpy是因为要注意lua的string可能中间包含0的情况)一份再异步处理

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
3 [报告]
发表于 2015-10-17 12:38 |只看该作者
Lua的字符串是垃圾回收的,因此你要么自己拷贝一份,要么把字符串锚定起来,都可以解决问题。

锚定的方案(假设你的字符串在C端用const char *s存储,在Lua栈的idx位置):
lua_pushvalue(L, idx);
lua_rawsetp(L, LUA_REGISTRYINDEX, s);

之后用完以后需要取消锚定,这样:
lua_pushnil(L);
lua_rawsetp(L, LUA_REGISTRYINDEX, s);

就不会有这个问题了。不只是字符串,任何可垃圾回收的值,如果需要异步处理(比如用于通知Lua的回调函数),都需要这样锚定住。

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
4 [报告]
发表于 2015-10-17 16:56 来自手机 |只看该作者
异步编程确实会遇到所谓乱序的问题,
可以自己加序号跟踪变量,出来的数据一起放到数组里

论坛徽章:
0
5 [报告]
发表于 2015-10-19 09:30 |只看该作者
回复 2# cokeboL


    好的 谢谢 我试一下

论坛徽章:
0
6 [报告]
发表于 2015-10-19 09:30 |只看该作者
回复 3# starwing83


    谢谢指导
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP