问题描述
最近在项目里面写了一个算法,居然有严重的内存泄露问题!!!为了解决这个问题,花了好几天时间,慢慢排除问题,终于解决了,在此记录一下。
阶段一:
刚开始发现问题时,我以为是我 new 出来的对象没有 delete 干净,所以我把所有 new 出来的东西,在使用后立马 delete 掉,所有能用局部变量的就用局部变量,能少用指针就少用指针。
!!!测试不过!!!
这时候应该意识到要看局部变量,没经验啊!
阶段二:
整个算法是以深度优先加并查集为基础的,使用递归方式实现,这时候怀疑递归爆栈了,但是根据测试log发现,递归深度也就几十。不管,递归改迭代!
!!!测试不过!!!与递归无关
阶段三:
并查集只起到辅助作用,删掉!(自己写的并查集类,因为项目都是自己定义的类型,怀疑并查集类写的有问题,项目无法正确释放内存)
!!!测试不过!!!事实证明:并查集没问题!
阶段四:
看到我用项目中的 map 模板,key 和 value 都是类对象,但是项目中也有类似的使用,简单怀疑,抱着试试看的态度修改。
把这个 map 的作用用其他方式替换!
!!!测试通过!!!
原因分析
为什么呢?
项目中原有程序有和我用一样的key,key 可以正常释放,但是项目中的 value 和我用的 value 都不一样,没办法正常释放!!
项目自定义的内存池无法处理我的 map,所以会有内存泄露,虽然这只是一个局部变量!!!
其他
为啥不直接用 asan 分析?
因为恰好最近 asan 环境有问题,只能看到最后一层堆栈信息,是内存池的处理,没啥有用的信息。
为啥花了好几天?
每次测试需要跑大半天,每次信心满满去测试,半天后归来无进展。。。
第一次遇到局部变量导致的内存泄露,记录一下,长个知识。