C++之内存泄漏排查详解

目录
  • 一 、经验排查
  • 二 、使用Visual Leak Detector for Visual C++
    • 2.1 Visual Leak Detector for Visual C++简介
    • 2.2 Visual Leak Detector源码获取编译
      • 2.2.1 源码获取,相关git地址
      • 2.2.2 发布版本获取
      • 2.2.3 进行编译
      • 2.2.4 自带gtest工程测试
    • 2.3 如何测试自己的项目呢
      • 2.3.1 配置工程
      • 2.3.2 编写简单的测试用例
      • 2.3.3 检测结果如图
  • 三、总结

一 、经验排查

有经验的程序员会对程序中申请内存的地方进行排查,例如malloc或者new关键字的地方进行跟踪,一种情况是我们按照程序逻辑进行了申请和释放,要提防程序在发生异常时没有如我们所期望的那样进行内存释放,此时也应当防止内存泄漏。

二 、使用Visual Leak Detector for Visual C++

2.1 Visual Leak Detector for Visual C++简介

  • Visual C++ 提供了内置的内存泄漏检测,但它的功能充其量只是最小的。此内存泄漏检测器是作为 Visual C++ 提供的内置内存泄漏检测器的免费替代品而创建的。以下是 Visual Leak Detector 的一些功能,内置检测器中不存在这些功能:
  • 为每个泄漏块提供完整的堆栈跟踪,包括可用的源文件和行号信息。

检测大多数(如果不是全部)进程内内存泄漏类型,包括基于 COM 的泄漏和基于纯 Win32 堆的泄漏。

  • 选定的模块(DLL 甚至主 EXE)可以从泄漏检测中排除。

提供泄漏块的完整数据转储(以十六进制和 ASCII 格式)。

可定制的内存泄漏报告:可以保存到文件或发送到调试器,并且可以包含可变级别的详细信息。

其他用于 Visual C++ 的售后泄漏检测器已经可用。但大多数真正流行的,如 Purify 和 BoundsChecker,都非常昂贵。存在一些免费的替代方案,但它们通常太具有侵入性、限制性或不可靠。 Visual Leak Detector 是目前唯一可免费使用的 Visual C++ 内存泄漏检测器,它将上述所有专业级功能整齐地打包在一个易于使用的库中。

2.2 Visual Leak Detector源码获取编译

2.2.1 源码获取,相关git地址

   git clone  https://github.com/oneiric/vld

2.2.2 发布版本获取

  • 在git主页有Visual Leak Detector for Visual C++ Releases,只需要下载对应的版本,进行安装即可。

2.2.3 进行编译

  • 本代码要求的vs版本为2019,博主使用的版本为为2015,在编译时候会报错
 项目-->属性--->常规-->平台工具集--->选择 Visual Studio 2015(v140)确定,就OK

2.2.4 自带gtest工程测试

  • 编译项目自带的vld_main进行测试,项目中自带gtest工程对相关内存泄漏场景进行了自测

2.3 如何测试自己的项目呢

2.3.1 配置工程

在自己的工程中引入vld.h文件,并在链接库中配置vld.lib库

设置当前工程为Debug模式,才能显示堆栈相关的调用信息

2.3.2 编写简单的测试用例

  • three.h
  #pragma once
  class three
  {
  public:
      three();
      ~three();
  };
  • three.cpp
 #include "three.h"

 three::three()
 {
 }

 three::~three()
 {
 }
  • main.cpp
  #include<stdlib.h>
  #include<stdio.h>
  #include <iostream>
  #include <vld.h>
  #include "three.h"
  using namespace std;

  int main()
  {
      cout << "vld test begin" << endl;
      int *one = new int[30];
      char *two = new char[40];
      three * tmp = new three();
      return 0;
  }

2.3.3 检测结果如图

程序执行完之后会在终端显示内存泄漏的的个数,并同时会打印相关的内存泄漏的堆栈信息,当鼠标点击终端信息输出的位置时,同时会在上方代码指示哪一行出现内存泄漏。

三、总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 详谈C++的内存泄漏问题

    1)有多少new就有多少delete.而且配对的new与delete要尽量在一个函数中.如果子函数中需要返回的数据是通过new来创建的,我的处理方式一般是在需要调用这个函数的位置将对应的数据规模创建好,并且通过指针或是引用传递到子函数中. 2)本人比较粗心大意,又一次在编码的过程中 竟然将delete语句放在了return语句的后面,导致程序运行的过程中会因内存不足二崩溃.检查了不下20遍才检查出来,真是哭的心情都有了.希望大家以我为戒,一定把return语句放在函数的最后面,估计也就我一个人犯

  • C++中关于Crt的内存泄漏检测的分析介绍

    尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询. 复制代码 代码如下: #ifdef _DEBUG#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#include <crtdbg.h>#ifdef _DEBUG#define new DEBUG_CLIENTBLOCK#e

  • c++ 排查内存泄漏的妙招

    前言 对于c++而言,如何查找内存泄漏是程序员亘古不变的话题:解决之道可谓花样繁多.因为最近要用到QT写程序,摆在我面前的第一个重要问题是内存防泄漏.如果能找到一个简单而行之有效的方法,对后续开发大有裨益.久思终得诀窍,本文就详细介绍我对此问题的应对之策.(文末符完整代码) 如何判断内存有泄漏 内存分配和释放对应的操作是new.delete.如何判断内存是否释放干净?其实判断起来非常简单:一个独立的模块整个生存周期内new的个数和delete的个数相等.用伪代码标示如下: int newCoun

  • C++内存泄漏及检测工具详解

    首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人都离不开它.此外就是不使用任何工具,而是自己来实现对内存泄露的监控,分如下两种情况: 一. 在 MFC 中检测内存泄漏 假如是用MFC的程序的话,很简单.默认的就有内存泄露检测的功能. 我们用VS2005生成了一个MFC的对话框的程序,发现他可以自动的检测内存泄露.不用我们做任何特殊的操作. 仔细

  • 如何通过wrap malloc定位C/C++的内存泄漏问题

    前言 用C/C++开发的程序执行效率很高,但却经常受到内存泄漏的困扰.本文提供一种通过wrap malloc查找memory leak的思路,依靠这个方法,笔者紧急解决了内存泄漏问题,避免项目流血上大促,该方法在日后工作中大放光彩,发现了项目中大量沉疴已久的内存泄漏问题. 什么是内存泄漏? 动态申请的内存丢失引用,造成没有办法回收它(我知道杠jing要说进程退出前系统会统一回收),这便是内存泄漏. Java等编程语言会自动管理内存回收,而C/C++需要显式的释放,有很多手段可以避免内存泄漏,比如

  • C++程序检测内存泄漏的方法分享

    一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成"统一"的标准.而在Windows平台,服务器和客户端开发人员惯用的调试方法有很大不同.下面结合我的实际经验,整理下常见定位内存泄漏的方法. 注意:我们的分析前提是Release版本,因为在Debug环境下,通过VLD这个库或者CRT库本身的内存泄漏检测函数能够分析出内存泄漏,相对而言比较简单.而服务器有很多问

  • C++之内存泄漏排查详解

    目录 一 .经验排查 二 .使用Visual Leak Detector for Visual C++ 2.1 Visual Leak Detector for Visual C++简介 2.2 Visual Leak Detector源码获取编译 2.2.1 源码获取,相关git地址 2.2.2 发布版本获取 2.2.3 进行编译 2.2.4 自带gtest工程测试 2.3 如何测试自己的项目呢 2.3.1 配置工程 2.3.2 编写简单的测试用例 2.3.3 检测结果如图 三.总结 一 .经

  • 内存溢出和内存泄漏的详解及区别

    内存溢出和内存泄漏的详解及区别 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光. memory leak会最终会导致out of memory! 内存溢出就是你要求分配的内存超出了系统能

  • nodeJs内存泄漏问题详解

    之前一次偶然机会发现,react 在server渲染时,当NODE_ENV != production时,会导致内存泄漏.具体issues: https://github.com/facebook/react/issues/7406 .随着node,react同构等技术地广泛运用,node端内存泄漏等问题应该引起我们的重视.为什么node容易出现内存泄漏以及出现之后应该如何排查,下面通过一个简单的介绍以及例子来说明. 首先,node是基于v8引擎基础上,其内存管理方式与v8一致.下面简单介绍v8

  • Tomcat 检测内存泄漏实例详解

     Tomcat如何检测内存泄漏 一般情况下,如果我们重启web应用是通过重启tomcat的话,则不存在内存泄漏问题.但如果不重启tomcat而对web应用进行重加载则可能会导致内存泄漏,因为重加载后有可能会导致原来的某些内存无法让GC回收,例如web应用使用了JDBC,驱动会进行注册,当web应用停止时没有反注册就会导致内存泄漏. 看看是什么原因导致tomcat内存泄漏的.这个要从热部署开始说起,因为tomcat提供了不必重启容器而只需重启web应用以达到热部署的功能,其实现是通过定义一个Web

  • JavaScript中的垃圾回收与内存泄漏示例详解

    前言 程序的运行需要内存.只要程序提出要求,操作系统或者运行时就必须供给内存.所谓的内存泄漏简单来说是不再用到的内存,没有及时释放.为了更好避免内存泄漏,我们先介绍Javascript垃圾回收机制. 在C与C++等语言中,开发人员可以直接控制内存的申请和回收.但是在Java.C#.JavaScript语言中,变量的内存空间的申请和释放都由程序自己处理,开发人员不需要关心.也就是说Javascript具有自动垃圾回收机制(Garbage Collecation). 一.垃圾回收的必要性 下面这段话

  • GoLang内存泄漏原因排查详解

    目录 背景 临时性内存泄漏 通道理解 背景 Go 语言中有对应的Go 内存回收机制,在Go采用 并发三色标记清除  算法, 但是由于实际的过程中 发现会有一些内存泄漏的常见,内存泄漏 分为: 临时性 和 永久性内存泄漏. 初步排查过程中: 发现Linux使用top 发现内存随着时间会持续的增加没有稳定在一个合理值中. 在使用 pprof ,BBC 等 Go的内存泄漏工具进行排查 临时性内存泄漏 指的释放内存 不及时,对应的内存在更晚时候释放,这类问题主要是 string,slice 和底层的Bu

  • Java GC 机制与内存分配策略详解

    Java GC 机制与内存分配策略详解 收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现 自动内存管理解决的是:给对象分配内存 以及 回收分配给对象的内存 为什么我们要了解学习 GC 与内存分配呢? 在 JVM 自动内存管理机制的帮助下,不再需要为每一个new操作写配对的delete/free代码.但出现内存泄漏和溢出的问题时,如果不了解虚拟机是怎样使用内存的,那么排查错误将是一项非常艰难的工作. GC(垃圾收集器)在对堆进行回收前,会先确定哪些对象"存活",哪些已经&quo

  • JVM内存参数配置详解

    首先我们知道:JVM发生内存错误的类型 1.堆内存泄漏:OutOfMemory:Java heap space 此种内存泄漏,增加内存,只能暂时解决问题,并不能根治问题.必须要优化代码,一定是代码的问题:排查堆中的大量对象,就会发现,这些对象都被引用,对象不能及时被回收,导致超出了堆的设定最大内存. 2.老年代内存泄漏:OutOfMemoryError:PermGen space 类名.访问修饰符.字段描述.方法描述等,所占空间大于永久代最大值,就会出现,一般都是初始化内存的时候,空间太小,解决

  • Java语言中的内存泄露代码详解

    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo

  • JVM入门之JVM内存结构内容详解

    一.java代码编译执行过程 源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件) 类加载:通过ClassLoader及其子类来完成JVM的类加载 类执行:字节码被装入内存,进入JVM虚拟机,被解释器解释执行   注:Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,   用Java语言编写并编译的程序可以运行在这个平台上 二.JVM简介 1.java程序经过一次编译之后,将java代码编译为字节码也就是class文件,然

随机推荐