[√]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);
    }
目录
相关文章
|
2月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
196 52
|
5天前
|
存储 程序员 编译器
什么是内存泄漏?C++中如何检测和解决?
大家好,我是V哥。内存泄露是编程中的常见问题,可能导致程序崩溃。特别是在金三银四跳槽季,面试官常问此问题。本文将探讨内存泄露的定义、危害、检测方法及解决策略,帮助你掌握这一关键知识点。通过学习如何正确管理内存、使用智能指针和RAII原则,避免内存泄露,提升代码健壮性。同时,了解常见的内存泄露场景,如忘记释放内存、异常处理不当等,确保在面试中不被秒杀。最后,预祝大家新的一年工作顺利,涨薪多多!关注威哥爱编程,一起成为更好的程序员。
|
2月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
62 6
|
2月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
439 9
|
2月前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
83 6
|
2月前
|
Web App开发 缓存 JavaScript
如何检测和解决闭包引起的内存泄露
闭包引起的内存泄露是JavaScript开发中常见的问题。本文介绍了闭包导致内存泄露的原因,以及如何通过工具检测和代码优化来解决这些问题。
|
3月前
|
Web App开发 开发者
|
3月前
|
缓存 监控 Java
内存泄漏:深入理解、检测与解决
【10月更文挑战第19天】内存泄漏:深入理解、检测与解决
154 0
|
3月前
|
数据处理 Python
Python读取大文件的“坑“与内存占用检测
Python读取大文件的“坑“与内存占用检测
97 0
|
3月前
|
存储 算法 C语言
MacOS环境-手写操作系统-15-内核管理 检测可用内存
MacOS环境-手写操作系统-15-内核管理 检测可用内存
62 0