战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

      最近在使用自己封住的一套lua库使用中遇到这样一个问题,多注册一个类成员函数后,即便一个lua文件都没加载,都会在lua_close中的freestack函数中crash

      我的lua封装非常简单,支持C++类成员函数调用上也是在luaplus基础上改造而来的:

    void register_helper( lua_State* L, int tableindex, const char* funcname, lua_CFunction dispatcher, void* func, int sizeoffunc, const void* userdata, int sizeofud )
    {
        // function | userdata = lightuserdata
        unsigned char* buffer = (unsigned char*)lua_newuserdata( L, sizeoffunc + sizeofud );
        memcpy( buffer, (void*)func, sizeoffunc );
        memcpy( buffer + sizeoffunc, &userdata, sizeofud );

        lua_pushstring( L, funcname );
        lua_pushlightuserdata( L, (void*)buffer);  
        lua_pushcclosure(L, dispatcher, 1);
        lua_settable( L, tableindex );
    }
    
 

检查发现,貌似是lua_newuserdata的问题,将其换为malloc,问题解决了。

虽然支持google了一下类似的问题,并且也在gc库内打过断点,new出来的内存绝非简单的被gc回收,而有可能是lua某些机制造成的,毕竟这样给C++做绑定是很常见的

马上做了一个list保存指针,并在lua_close之前清除这些指针,所有问题迎刃而解

posted on 2009-06-20 10:47 战魂小筑 阅读(685) 评论(0)  编辑 收藏 引用 所属分类: 脚本技术程序调试技术

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理