CCArmature内存泄露

引擎版本: 3.2
开发语言: lua
项目使用了大量的骨骼动画,在vs中加入vld之后,发现了骨骼动画回调的内存泄露,主要在setMovememtEventCallFunc与setFrameEventCallFunc中,相关源码如下:

static int lua_cocos2dx_ArmatureAnimation_setMovementEventCallFunc(lua_State* L)
{
//…
LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0));

    LuaArmatureWrapper* wrapper = new LuaArmatureWrapper();
    wrapper->autorelease();
    
    Vector<LuaArmatureWrapper*> vec;
    vec.pushBack(wrapper);
    ScriptHandlerMgr::getInstance()->addObjectHandler((void*)wrapper, handler, ScriptHandlerMgr::HandlerType::ARMATURE_EVENT);
//...

}
这里绑定的回调对象是一new出来的LuaArmatureWrapper对象,而且只有add没有remove操作,我把remove操作放到了LuaArmatureWrapper的析构函数中
LuaArmatureWrapper::~LuaArmatureWrapper()
{
ScriptHandlerMgr::getInstance()->removeObjectHandler(this, ScriptHandlerMgr::HandlerType::ARMATURE_EVENT);
}
加上如上操作后,发现依然没有完全释放,进入removeObjectHandler函数发现依然还有问题,引擎源码以及修改如下:
void ScriptHandlerMgr::removeObjectHandler(void* object,ScriptHandlerMgr::HandlerType handlerType)
{
//…
if (exist)
{
LuaEngine::getInstance()->removeScriptHandler(iterVec->second);
iterMap->second.erase(iterVec);
//下面代码为新增,已达到完全删除的目的
if (iterMap->second.size() <= 0) {
_mapObjectHandlers.erase(iterMap);
}
}
}

mark一下紫薯布丁