Lua __gc metamethod永远不会被称为

时间:2016-12-10 23:23:40

标签: c++ lua

我有一个 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元方法?

0 个答案:

没有答案