首页 > 系统相关 >C++内存泄漏检查工具——Valgrind(--tool = memcheck)

C++内存泄漏检查工具——Valgrind(--tool = memcheck)

时间:2024-11-12 20:50:45浏览次数:3  
标签:std -- memcheck tool int 内存 using new delete

在写c++程序中通常遇到程序崩溃,我们首先想到的是内存问题

如果代码量少看几遍就能看得出来,如果代码量多起来我们就得借助一些工具了比如gdb调试和valgrind中得memcheck来解决内存问题

我用的ubuntu,先安装valgrind

sudo apt  update

sudo apt install valgrind

valgrind --version

常见的内存问题 

  • 悬空指针的读写
  • 动态内存越界访问
  • 内存泄漏
  • double delete
  • 不匹配的使用 new/delete  和malloc/free
  • 访问野指针

悬空指针的读写

#inlude<iostream>
using namespace std;
int main()
{
   int* p=new int(10);
   delete p;
   int a=*p;
   cout<<a<<endl;
}

invalid read of size 4 显示我们代码7行在无效的读取4个字节的数据(int)

all heap blocks were free  显示堆内存没有内存泄漏

动态数组越界读写

#include<iostream>
using namespace std;
int main()
{
  int* a=new int[5];
  for(int i=0;i<=5;i++)  a[i]=i;
  for(int i=0;i<=5;i++)  cout<<a[i]<<endl;
  return 0;
}

特别的静态数组越界能通过gdb调试发现,但valgrind无能为力

内存泄漏

#include<iostream>
using namespace std;
int main()
{
   int *a=new int(10);
   return 0;
}

这里我们添加参数 --leak-check=full来看详细信息

出现两次 allocs 是因为程序中不仅有你显式分配的动态内存(new int(10)),还可能有额外的内存分配来自程序运行时的环境或库的初始化

其显示在第5行operate new出来的内存块丢失发生了内存泄漏

 double delete

#include<iostream>
using namespace std;
int main()
{
   int* a=new int(10);
   delete a;
   delete a;
   return 0;
}

显示无效free 第5行申请内存,但是6,7行都释放了内存,如果是多线程情况下可能会使释放内存后,内存新数据的错误释放,造成数据安全问题,所以我们要避免double delete

 不匹配的使用 new/delete  和malloc/free

#include<iostream>
using namespace std;
int main()
{
    int* a=new int(10);
    free(a);
    return 0;
}

会显示类型匹配问题

malloc和new的区别在于new在申请空间的同时会调用构造函数,并且new失败会抛出异常而malloc返回nullptr

delete 不仅会释放内存还会调用析构函数

当我们使用class时,就无法正常生成对象和析构对象

访问野指针 

#include<iostream>
using namespace std;
int mian()
{
   int* p;
   int a=*p;
}

 

显示使用未初始化的指针 

 静态数组越界问题我们通过gdb调试可以调试出来,会显示栈溢出

总结

  • 内存泄漏检测:能够跟踪动态内存分配,确保分配的内存在不再需要时被正确释放。
  • 越界访问检测:帮助识别动态数组越界、空指针解引用等错误。
  • 未初始化变量检测:检测使用未初始化变量的情况。
  • 典型应用场景:当程序涉及大量的动态内存分配,或频繁出现无效内存访问、内存泄漏等问题时,用 Valgrind 非常有效。

借鉴于C++内存泄漏检查工具——Valgrind(--tool = memcheck) - unique_ptr - 博客园

标签:std,--,memcheck,tool,int,内存,using,new,delete
From: https://blog.csdn.net/weixin_72492465/article/details/143722425

相关文章

  • Redis版本升级操作-4.0.10升级到5.0.6
    一、背景:当前开发和测试环境redis在linux服务器上部署,使用4.0.10版本,生产环境使用4.0.10和5.0.6版本。需要先将开发和测试环境版本升级到5.0.6,确认没有问题后,将生产环境版本统一升级为5.0.6版本。二、升级步骤:1、下载对应版本的redis到服务器/opt/目录,并解压:​cd /op......
  • gym103102H AND = OR 题解
    非常巧妙的一个题。我们首先考虑单组询问该怎么做。首先需要注意到一个结论,即设答案为\(x\),那么对于\(\forally<x\),\(y\)都应该放在与组;同样的,对于\(\forally>x\),\(y\)都应该放在与组。进一步的,我们观察在\(\text{popcount}\)上也有同样的性质,即对于\(\forally,......
  • 【无标题】
     修掉有透明和非透明部分的图案的白边'''去边后白色地方变成透明色星火讯飞、阿夏20240817'''importosfromPILimportImagepath=r'C:\Users\jg2yXRZ\OneDrive\桌面\20241110一款校服'folder_path=path+r'\01要放大'output_folder=path+r......
  • pjsip编译、说明及vs2022使用示例
    环境:window10_x64&vs2022pjsip版本:2.14.1 之前整理过pjsip2.10的编译及python使用示例:https://www.cnblogs.com/MikeZhang/p/pjsip20210116.htmlhttps://www.cnblogs.com/MikeZhang/p/win10py3pjsua-20211010.html 今天整理下pjsip2.14.1的编译、接口说明,以及在vs......
  • Jquery入门系列2---层次选择器
    上节课讲了基础选择器,我们来回顾一下,基础选择器包括类选择器,id选择器,元素选择器,以及这几种混和在一块的用法。今天我们来讲层次选择器。何为层次选择器呢?如果我们想通过DOM元素之间的层次关系来获取特定元素,比如后代元素,子元素,相邻元素,兄弟元素等,就需要层次选择器,下面我把层......
  • 基于java+springboot的社区帮帮团系统网站
    前言基于java+springboot的社区帮帮团系统网站是一个促进社区互助的综合性平台。它为社区居民提供便捷的注册与登录入口。居民可发布求助信息,详细描述问题,如家电维修、管道疏通、家教需求等,并可设置悬赏金额。同时,有能力提供帮助的居民能浏览这些求助,根据自身技能和......
  • 基于java+springboot的免费体育馆场地预约系统
    前言基于Java+SpringBoot的免费体育馆场地预约系统为民众健身提供了便利。系统存储体育馆各个场地的详细信息,包括场地类型(如篮球场、羽毛球场、乒乓球场等)、场地规格、可容纳人数、配套设施(如灯光、计分牌等)。用户可以方便地查看这些信息,根据自身需求选择合适的场地......
  • 基于java+springboot的美妆类免税商品选购系统
    前言基于Java+SpringBoot的美妆类免税商品选购系统为美妆爱好者购买免税商品提供了便捷途径。系统中存有丰富的美妆免税商品信息,涵盖各类品牌的口红、眼影、粉底、腮红等。每种商品都详细记录了品牌、型号、色号、功效、规格、免税价格等内容。同时,展示商品的高清图......
  • 区间$dp$
    区间\(dp\)特点,可由小区间加上一堆运算推到大区间(板子)或者一个序列,从中间扣掉一个/一堆点,扣掉后短处会连上,这种题也常用区间\(dp\)。(消除木块,恐狼后卫,最大收益,最小代价都是这种题),它们常要考虑删掉这段区间/点会产生的贡献,再加上外面的区间和,有时候还会开一些辅助数组或多开一个维......
  • 基于java+springboot的美食推荐系统
    前言基于Java+SpringBoot的美食推荐系统能为用户带来个性化的美食体验。系统收集了海量的美食信息,包括各种菜系、餐厅菜品、街头小吃等。每道美食都有详细介绍,如口味特点、食材构成、烹饪方式、价格范围等。同时,还整合了餐厅的相关信息,如地址、环境、营业时间、服务......