概念:
指程序在运行过程中动态申请的内存空间不再使用后没有及时释放或由于错误及漏洞,导致应用程序内存占用过多或无限增长(广义:未对系统资源及时释放)。
场景:
由于C类语言无自动回收机制 1. 忘记加上内存回收处理。delete []data; 2. 构造函数中申请空间,析构函数中忘记释放。 3. 库函数或者系统API中申请空间,返回指针给用户后,忘记释放。
解决:
(1)提前预防: A) 比如在程序中多使用strcpy_s、memcpy_s等具有缓冲区大小检查的函数,去取代strcpy、memcpy等; B)给工程设置编译选项/WX开启(“将警告视为错误”),严格要求自己,这样很可能避免了不少潜在的bug; C) 对自己的代码做好单元测试 (2)源码着手: 如果出现了这种难以查找的错误,可以从程序源码着手,查看一些和内存操作相关的函数,比如strcpy、memcpy等。防止如 strcpy拷贝一个字符串到一个空间不够的内存,从而导致程序异常:
(3)检测工具: 常用的有 BoundsCheaker、Deleaker、Visual Leak Detector等,工具毕竟熟能生巧,用户选择先自己喜欢的一款去用即可。