lua websocket导致的内存泄露
Application在析构的时候,会清理ScriptEngine,会触发清理websocket,websocket在清理的时候会清理注册到Director的事件,
因为我的Director在此Window关闭的时候已经清理了
就导致这里又会new一个单例,造成内存泄露
初步解决办法
Director的清理放到Application之后,Application其实是cocos2dx的概念,对于qt来说,只有一个QApplication、MainWindow,
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
所以应该是MainWindow里面有个CocosApp,这样就保证了CocosApp先释放,而不是App里面有个MainWindow
ScriptEngine又泄露了
修改完毕后,发现Application在析构的时候,会清理ScriptEngine,
如果先删除CocosApp,就会导致没有ScriptEngine,进而导致ScriptEngineManager内存泄露
相互依赖的关系太恶心了,正确的逻辑:
先Director->mainLoop执行最后一针后,在释放掉Director之前释放掉ScriptEngine,类似如下的伪代码:
void app(){
director->lastMainLoop();
scirptEngne->destroy();// websocket会调用director->instance
director->release();// 会调用ScriptEngine->instance
}
又发现Director->release()
会触发ScriptEngine,这样子的话就成为了死循环,始终无法清理干净
按照设计,ScriptEngine就是应该最后清理,那么websocket的问题,就简单粗暴的判断下是否director->instance()==nullptr
即可
- cocos/netword/websocket.cpp
Director* director = Director::valueInstance();
if (director)
{
director->getEventDispatcher()->removeEventListener(_resetDirectorListener);
}
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END