tolua++中暴露对象给lua时,一定要把析构函数暴露给lua
发布时间:2020-12-14 22:14:53 所属栏目:大数据 来源:网络整理
导读:题目不知道怎么取才好,但是意思很简单: 如果你暴露一个复杂对象给Lua,实现类似于OO编程的话,那么也要把析构函数暴露给Lua. 否则的话,lua gc的时候,回收垃圾对象,没有找到回收函数,就直接free掉了,这在C++中,是相当致命的. ? tolua++中的tolua_cclass函数,用
题目不知道怎么取才好,但是意思很简单: 如果你暴露一个复杂对象给Lua,实现类似于OO编程的话,那么也要把析构函数暴露给Lua. 否则的话,lua gc的时候,回收垃圾对象,没有找到回收函数,就直接free掉了,这在C++中,是相当致命的. ? tolua++中的tolua_cclass函数,用来注册lua对象,
?同时会把最后的那个参数col,注册到lua对象的元表里面: ?而发生gc的时候,class_gc_event函数会去在lua对象的元表里面找".collector"这个key,如果没找到,就用default的析构,否则就用用户提供的析构函数: (tolua_fast_isa(L,top,top-1,lua_upvalueindex(2)))
/* make sure we collect correct type */
{
/*fprintf(stderr,"Found type!n");*/
/* get gc function */
lua_pushliteral(L,monospace!important; min-height:inherit!important">);
lua_rawget(L,-2);??????????
/* stack: gc umt mt collector */
(lua_isfunction(L,-1)) {
}
else?
{
????????
lua_pop(L,1);
//这个是默认的析构函数
}
?
lua_pushvalue(L,1);????????
/* stack: gc umt mt collector u */
lua_call(L,1,0);
|
?而默认的析构函数是C free的简单封装:
{
?
void
* self = tolua_tousertype(tolua_S,0);
?
free
(self);
return?
0;
}