发现问题

不知从何时,我的网易云一直在启动后崩溃

今天心血来潮,决定一探究竟

注意到,启动之后,本地音乐旁边的圈圈一直在转

打开任务管理器,发现网易云在十秒钟之内吃了3.4个G内存,最后吃到3.8个G的时候崩溃了

任务管理器yyds
P1 任务管理器yyds

我立刻注意到,网易云是32位应用,内存极限是4G,于是可以判断是内存泄露的问题

内存是怎么泄露的?

打开VS进行调试,与刚刚的情况相同,内存吃满后报错

报错
P2 报错

查看输出,发现一堆的std::bad_alloc,这个时候学过C的都应该知道是程序malloc的内存不够导致的,而报错的,正是网易云ID3模块,看来是文件读取错误无疑了

内存泄漏
P3 内存泄漏

神秘的测试文件

向上继续翻,发现了关键信息,所有的报错都指向了同一个文件夹 taglib-1.12/test/data

目标锁定
P4 目标锁定

这个文件夹是我最近在写taglib的项目时从SourceForge上下的taglib源码,而test里面存放的都是taglib的测试文件(debug用),data里面的歌曲都是些为了故意为难程序而放的

随后,我尝试了删除文件夹,果然,文件夹正在被占用,到此为止已经真相大白了,网易云读taglib的测试文件发生错误,于是一直while循环读取发生错误的文件,导致内存迅速吃满,触碰到32位程序4G的极限之后崩溃

文件夹被占用
P5 文件夹被占用

后记

大公司的屎山代码实在可怕

各位写C/C++的时候一定要做好内存管理,不然可以和我一样转投Node,Python,C#等有垃圾回收器的语言(doge)

幸亏网易云是32位的,不然会直接吃满我的内存直接把系统都卡死(长叹一口气)