使用 Valgrind 检测内存泄漏

news2024/11/20 0:31:09

Valgrind 是一个编程工具,用于内存调试、内存泄漏检测以及性能分析。Valgrind 工具集中的 Memcheck 是用于检测内存管理和线程错误的主要工具。

参考:https://blog.csdn.net/weixin_44046545/article/details/138417524

1、安装 Valgrind

sudo apt-get install valgrind  # Debian/Ubuntu
sudo yum install valgrind      # CentOS/Fedora

2、运行 Valgrind

要使用 Valgrind 检测一个程序的内存泄漏,首先确保你的程序是带调试信息编译的(通常是 -g 编译器选项)。然后,运行以下命令:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./your_program

其中 ./your_program 是你的可执行文件。

--leak-check=full:进行内存泄漏检测并给出每个泄漏的详细信息。
--show-leak-kinds=all:报告所有类型的内存泄漏。
--track-origins=yes:跟踪未初始化值的来源,有助于发现使用未初始化内存的错误。

3、分析 Valgrind 输出实例

(1)没有内存泄漏的程序

文件:no_leak.cpp

#include <iostream>

int main() {
    int* data = new int[10];  // 动态分配内存

    for (int i = 0; i < 10; ++i) {
        data[i] = i;
    }

    // 使用完内存后,正确释放内存
    delete[] data;

    return 0;
}

编译方法
使用下面的命令来编译这个程序,确保包含 -g 选项以便 Valgrind 可以提供关于源代码的详细信息。

g++ -g no_leak.cpp -o no_leak

使用 Valgrind 检测

运行 Valgrind 来检查内存泄漏:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./no_leak

在这里插入图片描述

(2) 有内存泄漏的程序

这个程序同样动态分配内存,但忘记释放内存,从而造成内存泄漏。
文件:has_leak.cpp

#include <iostream>

int main() {
    int* data = new int[10];  // 动态分配内存

    for (int i = 0; i < 10; ++i) {
        data[i] = i;
    }

    // 忘记释放内存
    // delete[] data;  // 这行应该被取消注释来避免内存泄漏

    return 0;
}

编译方法
同样,使用 -g 选项来编译程序:

g++ -g has_leak.cpp -o has_leak

使用 Valgrind 检测
运行 Valgrind 来检查程序是否有内存泄漏:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./has_leak

在这里插入图片描述

解释输出

  • Memcheck, a memory error detector: 这一行表明你正在使用 Memcheck 工具,它是 Valgrind
    中用于检测内存错误的一个工具。
  • Command: 显示了被检测的命令行。
  • HEAP SUMMARY: 总结了程序退出时堆内存的使用情况。
  • in use at exit: 程序结束时,仍然有40字节的内存在使用中,没有被释放。
  • total heap usage: 程序共申请了2次内存,释放了1次,总共分配了72,704字节的堆内存。
  • 40 bytes in 1 blocks are definitely lost:
    表示有40字节的内存在一个块中被“绝对丢失”,也就是说这块内存没有被释放且无法再被访问。
  • at 0x483C583: 内存分配发生的位置的内存地址。
  • operator new[](unsigned long): 内存是通过 new[] 操作符分配的。
  • by 0x10919E: 内存分配发生在 has_leak.cpp 的第4行。
  • LEAK SUMMARY: 显示了内存泄漏的总结。
  • definitely lost: 明确报告了40字节被泄漏。
  • indirectly lost: 没有间接丢失的内存。
  • possibly lost: 没有可能丢失的内存。
  • still reachable: 没有仍可达的内存。
  • suppressed: 没有被抑制的错误。
  • ERROR SUMMARY: 总结了检测到的错误数。此处显示有1个错误。

此输出表明程序存在内存泄漏,具体来说,是在 has_leak.cpp 文件的第5行通过 new[] 动态分配的40字节内存没有被释放。通过这些详细信息,你可以直接定位到代码中的问题位置并修正它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1663664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机在网状态多方面重要性

手机在网状态的重要性体现在多个方面&#xff0c;它是现代社会中人们保持联系、获取信息以及进行日常活动不可或缺的一部分。以下是一些关于手机在网状态重要性的详细解释&#xff1a; 通信联系&#xff1a; 手机是在现代社会中进行通信联系的主要工具。当手机处于在网状态时&…

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第8章 安装编译所需要的依赖包

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

(41)5.6-5.8数据结构(栈和队列的应用和数组)

1.栈在括号匹配中的应用 #define _CRT_SECURE_NO_WARNINGS #define MaxSize 10 typedef struct { char data[MaxSize];//静态数组存放栈中元素 int top; //栈顶指针 }SqStack;//初始化栈 void InitStack(SqStack& S);//判断栈是否为空 bool StackEmpty(SqStack S…

(已解决)org.springframework.amqp.rabbit.support.ListenerExecutionFailedException

报错截图 解决方案 1、登录rabbitMQ网址&#xff0c;删除所有队列 2、重启rabbitMQ 亲测有效&#xff01;&#xff01;&#xff01;亲测有效&#xff01;&#xff01;&#xff01;亲测有效&#xff01;&#xff01;&#xff01;

【工具】Office/WPS 插件|AI 赋能自动化生成 PPT 插件测评 —— 必优科技 ChatPPT

本文参加百度的有奖征文活动&#xff0c;更主要的也是借此机会去体验一下 AI 生成 PPT 的产品的现状&#xff0c;因此本文是设身处地从用户的角度去体验、使用这个产品&#xff0c;并反馈最真实的建议和意见&#xff0c;除了明确该产品的优点之外&#xff0c;也发现了不少缺陷和…

无需公网IP、无需云服务器,异地组网实现远程直连NAS、游戏联机

手机图片、视频太多&#xff0c;存储空间不够用怎么办?出门在外无法直连家中NAS&#xff0c;远程访问NAS速度慢&#xff1f;自建私有云、多媒体服务器&#xff0c;如何多人远程共享媒体资源&#xff1f;幻兽帕鲁、我的世界、泰拉瑞亚…局域网游戏&#xff0c;想远程多人联机&a…

PAD如何实现在用RJ45上网的同时还能保证PAD的续航?|边充电边上网

在数字化时代&#xff0c;手机已经成为我们生活、工作的得力助手。当提及手机边上网边充电时&#xff0c;或许您会想&#xff1a;“这不是常态吗&#xff1f;”但今天&#xff0c;我们要探讨的是一个更为特殊而重要的场景——有线网络直连手机。对于那些需要稳定网络连接、不能…

面试官:SPA(单页应用)首屏加载速度慢怎么解决

一、什么是首屏加载 首屏时间&#xff08;First Contentful Paint&#xff09;&#xff0c;指的是浏览器从响应用户输入网址地址&#xff0c;到首屏内容渲染完成的时间&#xff0c;此时整个网页不一定要全部渲染完成&#xff0c;但需要展示当前视窗需要的内容 首屏加载可以说是…

如何获得一个Oracle 23ai数据库(RPM安装)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 方法包括3种&#xff0c;本文介绍第2种&#xff1a; Virtual ApplianceRPM安装Docker RPM安装支持Linux 8和Linux 9。由于官方的Vi…

安装配置pushgateway

环境 主机名 服务器IP 系统 说明 Ubuntu -1 192.168.1.144 Ubuntu.20.04 docker安装Prometheus docker 192.168.1.140 cent…

GPIO输出速度(ARM-GD32)

单片机输出速度对GPIO硬件的影响 如果T为100ns 那么2/3*100ns 67ns 那么tr tf 38 ns &#xff08;也就是不能超过32ns&#xff09; tr 和tf和什么东西有关如何去控制 CL 是一个电容&#xff0c;电容会改变和影响电压变化的速率&#xff0c;输出高低电平也就是对电容进行充电…

QT的C++版本是如何从ui文件编译成C++可以使用的.h文件的

Desktop_Qt_6_7_0_MinGW_64_bit是一个编译器&#xff0c;可以将ui文件编译为.h文件。我们可以在项目文件下看到这一样一个文件&#xff1a; 这里的ui_mainwindow.h文件我们可以打开看一下&#xff1a;你会发现你所有的ui设计都被记录在了这里。 /***************************…

让SOLIDWORKS用户无忧的基于云的PLM

在市场需求和法规不断变化的时代&#xff0c;紧跟变化步伐对于更快速、更有效地交付创新的高质量产品至关重要。 现代产品开发流程会生成数量惊人的数据&#xff0c;从零件和装配体文件到仿真和CAD/CAM文件。此外&#xff0c;要实现有效的项目交流&#xff0c;需要无数的文件&…

羊大师:羊奶纯鲜儿童健康每一天

羊大师&#xff1a;羊奶纯鲜儿童健康每一天 羊奶因其纯鲜和营养丰富的特性&#xff0c;羊大师发现羊奶对于儿童的健康成长具有诸多益处&#xff0c;确实可以帮助儿童度过健康快乐的每一天。 营养丰富&#xff1a;羊奶中含有丰富的蛋白质、矿物质、维生素和微量元素等&#xf…

《ElementUI 基础知识》el-tree 之“我的电脑”目录结构效果

前言 项目需求&#xff0c;Web 端获取服务器文件夹目录结构。目录数据是调接口获取&#xff0c;本篇略过&#xff0c;直接展现数据&#xff01; 效果 实现 html 代码 8 - 15 行&#xff0c;自定义节点信息&#xff1b;代码 9 - 14 行&#xff0c;判断 icon 显示&#xff1b…

物联网概述定义体系架构、与云计算关系

物联网概述 物联网综述 所谓物联网是指把所有物品通过射频识别等信息传感设备与互联网连接起来&#xff0c;从而实现智能化识别和管理&#xff0c;是继计算机、互联网和移动通信之后的又一次信息产业的革命性发展。 以信息感知为特征的物联网被称为世界信息产业的第三次浪潮…

(三)Appdesigner-界面转换及数据导入和保存

提示&#xff1a;文章为系列文章&#xff0c;可以在对应学习专栏里面进行学习。对应资源已上传 目录 前言 一、Appdesigner是什么&#xff1f; 二、界面切换 三、数据导入及保存 &#xff08;一&#xff09;数据导入 &#xff08;二&#xff09;数据保存 总结 前言 Appd…

vs2019中__cplusplus一直显示199711

vs2019中__cplusplus一直显示199711&#xff0c;如何修改&#xff1f; 打开属性->C/C->命令行&#xff0c;其他选项&#xff0c;输入&#xff1a;/Zc:__cplusplus

第七届精武杯部分wp

第一部分&#xff1a;计算机和手机取证 1.请综合分析计算机和手机检材&#xff0c;计算机最近一次登录的账户名是 答案&#xff1a;admin 创建虚拟机时直接给出了用户名 2. 请综合分析计算机和手机检材&#xff0c;计算机最近一次插入的USB存储设备串号是 答案&#xff1a…

【工具】2024年最新贵州省专业技术人员继续教育自动倍速刷课时脚本 - 篡改猴脚本

&#x1f525;&#x1f525;2024年最新贵州省专业技术人员继续教育自动倍速刷课时脚本|静音播放|自动跳过已完成的视频|解除防挂机提示|稳定极高 篡改猴脚本库国内地址&#xff1a;https://greasyfork.org/zh-CN/scripts/494638 一、自动播放脚本 脚本如下&#xff0c;仅供…