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

内存泄露

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

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

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

VS 性能探测器

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

性能探测器位于调试目录下。
在这里插入图片描述
他能做的也很多,根据名字可知道,主要用于性能调优,具体可参考官方文档,这里我们只讲如何根据内存使用率来查找内存泄露。

教程

步入正题。

分析步骤

需要注意只能是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 <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();
    }
}

不带调试器

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

在这里插入图片描述

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

带调试器

与不带调试器,大同小异

  1. 开始调试,打开诊断工具栏,点击开启开启堆分析
  2. 拍两张快照进行分析
  3. 同上第五步执行
    在这里插入图片描述

在这里插入图片描述

写在后面

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值