Lua __gc元方法从未被调用

我有一个被封装为Lua工作的_Vector_类,C++部分类是:

模板<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();
}
模板<typename T> CVector<T>::~CVector(void)
{
  如果(m_vector){
        m_vector->清除();
        删除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元方法从未被调用,并且对于大的_Vector_来说,内存使用量会增加,除非我从lua中调用v:__gc()。我的问题是为什么__gc元方法从未被调用?

点赞