分析c++内存泄露(使用VS 性能探查器)

这里写目录标题

  • 内存泄露
  • VS 性能探测器
  • 教程
    • 分析步骤
    • 不带调试器
    • 带调试器
  • 写在后面

内存泄露

最近项目中发现了比较多的内存泄露的问题。

我在这里给大家介绍windows平台下 简单说明下如何使用 VS性能探查器 快捷定位内存泄露的方法,方便自行定位分析。

效率工具要尽可能利用上。

VS 性能探测器

虽然VS这种笨重的IDE已经不在是我开发的第一选择,但不得不说VS的配套工具相当完善,当需要的时候非常舒心,性能探查器就是其中我最常用的工具之一。

性能探测器位于调试目录下。
分析c++内存泄露(使用VS 性能探查器)_第1张图片
他能做的也很多,根据名字可知道,主要用于性能调优,具体可参考官方文档,这里我们只讲如何根据内存使用率来查找内存泄露。

教程

步入正题。

分析步骤

需要注意只能是debug模式,分析需要debug信息,结果会更详尽。
使用非常简单,只有三步

  1. 启动性能探查器(带调试器或不带调试器)
  2. 拍两次快照
  3. 对比分析,分析对象数量和内存数量;

简单写个例程

/*
 * @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 
#include 
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();
    }
}

不带调试器

  1. 启动探查器 ,勾选内存使用率,选择直接启动或者附加到进程,点开始

分析c++内存泄露(使用VS 性能探查器)_第2张图片

  1. 前后拍摄两次快照 分析c++内存泄露(使用VS 性能探查器)_第3张图片
  2. 点击停止收集,停止收集才能查看快照信息
  3. 点击快照蓝字查看报告, 如图涨了120k,对象数量没有增加。
    分析c++内存泄露(使用VS 性能探查器)_第4张图片
  4. 点击查看堆内容,选择比对对象,查看差异,如图可知一个int数组发生泄露
    分析c++内存泄露(使用VS 性能探查器)_第5张图片
    分析c++内存泄露(使用VS 性能探查器)_第6张图片
  5. 双击对象,查看实例,可以根据展示内容查看分配调用堆栈,可知具体泄露对象在哪里,鼠标悬停可以查看对象值辅助分析。
    分析c++内存泄露(使用VS 性能探查器)_第7张图片
    分析c++内存泄露(使用VS 性能探查器)_第8张图片
    分析c++内存泄露(使用VS 性能探查器)_第9张图片
    以上分析可知,在行号18行执行完vec.emplace_back(i) 后泄露。

带调试器

与不带调试器,大同小异

  1. 开始调试,打开诊断工具栏,点击开启开启堆分析
  2. 拍两张快照进行分析
  3. 同上第五步执行
    分析c++内存泄露(使用VS 性能探查器)_第10张图片

分析c++内存泄露(使用VS 性能探查器)_第11张图片

写在后面

关于泄露,开发中的注意几个点:

  • 尽量使用智能指针,避免原始指针new malloc。
  • 尽量用通用代码以取代ifelse控制业务分支,方面边界测试,各个函数ifelse组合会导致内部白盒测试很容易遗漏case,外部黑盒测试更难覆盖全,做到泄露问题易发现早暴露早解决。
  • 正确使用容器类,长生命周期的容器注意插入逻辑。

你可能感兴趣的:(C\C++,c++,开发语言)