内存泄露
最近项目中发现了比较多的内存泄露的问题。
我在这里给大家介绍windows平台下 简单说明下如何使用 VS性能探查器 快捷定位内存泄露的方法,方便自行定位分析。
效率工具要尽可能利用上。
VS 性能探测器
虽然VS这种笨重的IDE已经不在是我开发的第一选择,但不得不说VS的配套工具相当完善,当需要的时候非常舒心,性能探查器就是其中我最常用的工具之一。
性能探测器位于调试目录下。
他能做的也很多,根据名字可知道,主要用于性能调优,具体可参考官方文档,这里我们只讲如何根据内存使用率来查找内存泄露。
教程
步入正题。
分析步骤
需要注意只能是debug模式,分析需要debug信息,结果会更详尽。
使用非常简单,只有三步
- 启动性能探查器(带调试器或不带调试器)
- 拍两次快照
- 对比分析,分析对象数量和内存数量;
简单写个例程
/*
* @Author: shanRX
* @Date: 2022-02-21 18:50:37
* @LastEditTime: 2022-02-21 19:08:56
* @LastEditors: shanRX
* @Description:
* @FilePath: \test_memory_leak\main.cpp
*
*/
#include <iostream>
#include <vector>
using namespace std;
void leak_func(int i)
{
static vector<int> vec;
vec.emplace_back(i); //行号 17
}
void func()
{
cout << "do leak_func(1)" << endl;
leak_func(1);
}
int main(int, char**)
{
while (1) {
func();
}
}
不带调试器
- 启动探查器 ,勾选内存使用率,选择直接启动或者附加到进程,点开始
- 前后拍摄两次快照
- 点击停止收集,停止收集才能查看快照信息
- 点击快照蓝字查看报告, 如图涨了120k,对象数量没有增加。
- 点击查看堆内容,选择比对对象,查看差异,如图可知一个int数组发生泄露
- 双击对象,查看实例,可以根据展示内容查看分配调用堆栈,可知具体泄露对象在哪里,鼠标悬停可以查看对象值辅助分析。
以上分析可知,在行号18行执行完vec.emplace_back(i) 后泄露。
带调试器
与不带调试器,大同小异
- 开始调试,打开诊断工具栏,点击开启开启堆分析
- 拍两张快照进行分析
- 同上第五步执行
写在后面
关于泄露,开发中的注意几个点:
- 尽量使用智能指针,避免原始指针new malloc。
- 尽量用通用代码以取代ifelse控制业务分支,方面边界测试,各个函数ifelse组合会导致内部白盒测试很容易遗漏case,外部黑盒测试更难覆盖全,做到泄露问题易发现早暴露早解决。
- 正确使用容器类,长生命周期的容器注意插入逻辑。