我有一个 Vector 类,它被包装在Lua中工作。该类的C ++部分是:
template<typename T> CVector<T>::CVector(int len)
{
m_vector=new vector<T>(len);
for(int i=0;i<len;i++) m_vector->at(i)=T();
}
template<typename T> CVector<T>::~CVector(void)
{
if(m_vector){
m_vector->clear();
delete m_vector;
}
m_vector=0;
}
我使用https://bitbucket.org/alexames/luawrapper/src中的包装库。 Vector 的包装器部分是:
CVector<double>* Vector_new(lua_State* L)
{
CVector<double>* retVec=0;
int type = lua_type(L, 1);
if(type==LUA_TTABLE)retVec=new CVector<double>(L,1);
if(type==LUA_TNUMBER){
int len = luaL_checknumber(L, 1);
retVec=new CVector<double>(len);
}
return retVec;
}
int Vector_gc(lua_State* L)
{
CVector<double>* vec = luaW_check<CVector<double> >(L, 1);
//luaW_release(L, vec);
if(vec) delete vec;
vec=0;
wxMessageBox("GC is called");
return 0;
}
static luaL_Reg Vector_table[] = {{ NULL, NULL }};
static luaL_Reg Vector_metatable[] = {
{"__gc", Vector_gc},
{ NULL, NULL }
};
int luaopen_Vector(lua_State* L)
{
luaW_register<CVector<double> >(L, "Vector", Vector_table, Vector_metatable, Vector_new);
lua_pop(L,1);
return 0;
}
根据库的文档,如果使用luaW_register
,则指针的所有者为Lua,除非luaW_release
明确释放它。我使用以下Lua代码测试包装器:
for i=1,2 do local v=Vector.new(2) end
我的理解是当local v
超出范围时,它应该被垃圾收集。我明确地调用了collectgarbage
,但是从未调用元方法__gc
并且大向量的内存使用量增加,除非我使用v:__gc()
从lua调用。我的问题是为什么永远不会调用__gc
元方法?