[√]cocos2dx vld检测lua websocket的内存泄露问题

简介: [√]cocos2dx vld检测lua websocket的内存泄露问题

lua websocket导致的内存泄露

image.png

Application在析构的时候,会清理ScriptEngine,会触发清理websocket,websocket在清理的时候会清理注册到Director的事件,

image.png

因为我的Director在此Window关闭的时候已经清理了

image.png

就导致这里又会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,

image.png

如果先删除CocosApp,就会导致没有ScriptEngine,进而导致ScriptEngineManager内存泄露

image.png

相互依赖的关系太恶心了,正确的逻辑:

先Director->mainLoop执行最后一针后,在释放掉Director之前释放掉ScriptEngine,类似如下的伪代码:

void app(){
    director->lastMainLoop();
    scirptEngne->destroy();// websocket会调用director->instance
    director->release();// 会调用ScriptEngine->instance
}

又发现Director->release()会触发ScriptEngine,这样子的话就成为了死循环,始终无法清理干净

image.png

按照设计,ScriptEngine就是应该最后清理,那么websocket的问题,就简单粗暴的判断下是否director->instance()==nullptr即可

  • cocos/netword/websocket.cpp
    Director* director = Director::valueInstance();
    if (director)
    {
        director->getEventDispatcher()->removeEventListener(_resetDirectorListener);
    }
目录
相关文章
|
4月前
|
C语言 C++
[√]luahelper为什么无法调试cocos2dx lua
[√]luahelper为什么无法调试cocos2dx lua
47 0
cocos2dx 3.2之Lua打飞机项目
1          创建lua打飞机项目 cocos new T32Lua -dE:\Installed\cocos2d-x-3.2\cocos2d-x-3.2\projects -l lua 2  项目代码 Common.lua --用于打印日志信息 function cclog(...)     print(string.format(...)
1900 0
|
XML 数据格式
[cocos2dx lua] 打表工具
cocos2dx lua工程里常常要用到数值,数值策划将数据填写在一个个excel表格里面,但程序要用到数据是.lua格式的table,这时就要用到打表工具,这个工具是我的上司写的,具体的开发实现还没有研究,日后可以研究一下,但原理就是通过自己配置.table文件,本质是xml,这个文件跟excel一一对应,也就是.table文件指定了excel的格式。
1128 0
[cocos2dx lua]cocos2dx lua入门
最基本的层 [plain] view plaincopy function createInGameLayer()            local inGameLayer = cc.
1073 0
|
2月前
|
存储 NoSQL 关系型数据库
使用lua脚本操作redis
使用lua脚本操作redis
32 0
|
2月前
|
NoSQL Java Redis
Redis进阶-lua脚本
Redis进阶-lua脚本
46 0
|
25天前
|
NoSQL Java 数据处理
Redis和Spring Boot的绝佳组合:Lua脚本的黑科技
Redis和Spring Boot的绝佳组合:Lua脚本的黑科技
25 0