cocos2dx之内存泄漏解决机制
大家好,我是Lampard
今天与大家探讨一下cocos中发生内存泄漏的解决机制
c++层面的内存泄漏解决
写项目难免会有内存泄漏情况,对于c++层面的代码来说我们可以使用vld这个ku来进行内存泄漏的判断。具体操作如下:
1.首先下载安装 vld,下载后双击安装
2.在项目c++目录加载链接vld库
3.找到程序入口main.cpp,添加引用头 #include <vld.h>
4.启动调试——>执行到我检测内存泄漏的页面——>停止调试
最后定位到造成内存泄漏的代码行,根据游戏逻辑解决即可。
reference:VS内存泄漏检测之 vld ( cocos2d-x 检测内存泄漏)
Lua层面的内存泄漏解决
代码逻辑一般是写在脚本语言中,现在就看看怎么解决lua层面的内存泄漏。
对代码逻辑不熟悉的情况
使用云风大大的snapshot 的库,只提供一个函数,用 C 直接调用 lua API 来遍历 lua State,它可以对当前的 Lua_State 做一个完整的快照。我们可以在不同时间,对 Lua State 拍两个快照,相比较后,就很容易知道新增加的内存处于何处了。
reference:使用snapshot定位内存泄漏
对代码逻辑比较熟悉的情况
通常产生泄漏的都是一些被反复创建的类型,若对代码逻辑比较熟悉,可以定义一个全局的弱表(使其key为弱引用,然后在每次创建那些可能存在泄漏的对象的时候,都放入这个table,让其作为key,value通常我会用当前时间。)由于弱引用的性质,如果其他引用都消失了,那么在弱引用table中对这个对象的引用也会消失(变成nil),反之,只要还有其它任何一个引用存在,这个弱引用表中对这个对象的引用就继续存在。依赖这个特性,当程序已经跑过释放对象的逻辑后,如果这个表中还存在有这个对象的引用,那么这个对象肯定就是泄漏了。