[√]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);
    }
目录
相关文章
|
7天前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
3月前
|
存储 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
53 0
|
5天前
|
设计模式 Java Android开发
安卓应用开发中的内存泄漏检测与修复
【9月更文挑战第30天】在安卓应用开发过程中,内存泄漏是一个常见而又棘手的问题。它不仅会导致应用运行缓慢,还可能引发应用崩溃,严重影响用户体验。本文将深入探讨如何检测和修复内存泄漏,以提升应用性能和稳定性。我们将通过一个具体的代码示例,展示如何使用Android Studio的Memory Profiler工具来定位内存泄漏,并介绍几种常见的内存泄漏场景及其解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的技巧和方法,帮助你打造更优质的安卓应用。
|
1月前
|
Linux Windows
检测进程内存的活跃程度
检测进程内存的活跃程度
|
2月前
|
Linux 测试技术 C++
内存管理优化:内存泄漏检测与预防。
内存管理优化:内存泄漏检测与预防。
44 2
|
3月前
|
监控 Java Android开发
探究Android应用开发中的内存泄漏检测与修复
在移动应用的开发过程中,优化用户体验和提升性能是至关重要的。对于Android平台而言,内存泄漏是一个常见且棘手的问题,它可能导致应用运行缓慢甚至崩溃。本文将深入探讨如何有效识别和解决内存泄漏问题,通过具体案例分析,揭示内存泄漏的成因,并提出相应的检测工具和方法。我们还将讨论一些最佳实践,帮助开发者预防内存泄漏,确保应用稳定高效地运行。
|
5月前
|
算法 Java Python
【Python 的内存管理机制专栏】Python 内存管理实战:性能优化与内存泄漏检测
【5月更文挑战第18天】Python内存管理关乎程序性能与稳定性。优化包括避免过多临时对象,如优化列表推导式减少对象创建。警惕循环引用造成的内存泄漏,如示例中的Node类。使用`gc`模块检测泄漏,通过`gc.set_debug(gc.DEBUG_LEAK)`和`gc.collect()`获取信息。实践中需持续分析内存使用,优化算法、数据结构和资源释放,以提升程序质量与效率。
64 9
【Python 的内存管理机制专栏】Python 内存管理实战:性能优化与内存泄漏检测
|
4月前
|
Java Linux PHP
【应急响应】后门攻击检测指南&Rookit&内存马&权限维持&WIN&Linux
【应急响应】后门攻击检测指南&Rookit&内存马&权限维持&WIN&Linux
|
4月前
|
监控 Linux 测试技术
edac是检测什么的,和centos内存条损害检测工具
【6月更文挑战第1天】edac是检测什么的,和centos内存条损害检测工具
110 2
|
4月前
|
Java 数据库连接 图形学
JVM内存泄漏检测与处理
JVM内存泄漏检测与处理
27 0
下一篇
无影云桌面