使用 Valgrind 检测内存泄漏

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.hqwc.cn/news/688754.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

charts3D地球--添加航线

要在地球视角下画出海运路线图 方案 添加 globl 地球创建geo地理坐标系创建canvas对象用于承载地图世界地图this.worldChart //初始化canvas节点let cav document.createElement("canvas");this.$echarts.registerMap("world", geoJson);this.worldCha…

【JVM】ASM开发

认识ASM ASM是一个Java字节码操纵框架&#xff0c;它能被用来动态生成类或者增强既有类的功能。 ASM可以直接产生二进制class文件&#xff0c;也可以在类被加载入虚拟机之前动态改变类行为&#xff0c;ASM从类文件中读入信息后能够改变类行为&#xff0c;分析类信息&#xff…

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter)

【C语言/Python】嵌入式常用数据滤波处理&#xff1a;卡尔曼滤波器的简易实现方式&#xff08;Kalman Filter&#xff09; 文章目录 卡尔曼滤波卡尔曼滤波公式卡尔曼滤波数据处理效果C语言的卡尔曼滤波实现附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Pack…

林更新博士之路星途璀璨再启航

林更新&#xff1a;博士之路&#xff0c;星途璀璨再启航在这个充满机遇与挑战的时代&#xff0c;有一位演员以其出色的演技和不懈的努力&#xff0c;赢得了无数观众的喜爱。他&#xff0c;就是林更新。今日&#xff0c;一条消息如重磅炸弹般在娱乐圈炸开&#xff0c;让无数粉丝…

jenkins部署想定报错

报错&#xff1a; 解决办法&#xff1a; 登录被编译的设备&#xff0c;清楚旧代码&#xff0c;在重新执行

Dbeaver network unavailable due to certificate issue

场景&#xff1a;出现在DBeaver连接数据库下载驱动的时候 解决&#xff1a; 别勾选就可以了

Mac YOLO V9推理测试(基于ultralytics)

环境&#xff1a; Mac M1 (MacOS Sonoma 14.3.1) Python 3.11PyTorch 2.1.2 一、准备工作 使用YOLO一般都会接触ultralytics这个框架&#xff0c;今天来试试用该框架进行YOLO V9模型的推理。 YOLOv9目前提供了四种模型下载&#xff1a;yolov9-c.pt、yolov9-e.pt、gelan-c.p…

LTD273次升级 | 抖音小程序新增多种支付方式 • 用户余额充值支持AsiaPay • 社区问答FAQ可设置推荐内容

1、抖音小程序接入支付功能&#xff1b; 2、充值增加AsiaPay海外支付&#xff1b; 3、商品分类列表页面URL支持分类链接&#xff1b; 4、用户社区求助内容支持设置推荐&#xff1b; 5、已知问题修复与优化&#xff1b; 01 商城 1) 新增抖音支付功能 本次升级我们为抖音小…

一个开源即时通讯源码

一个开源即时通讯源码 目前已经含服务端、PC、移动端即时通讯解决方案&#xff0c;主要包含以下内容。 服务端简介 不要被客户端迷惑了&#xff0c;真正值钱的是服务端&#xff0c; 服务是采用Java语言开发&#xff0c;基于spring cloud微服务体系开发的一套即时通讯服务端。…

使用map类型的参数在mapper.xml中使用案例

使用map类型的参数在mapper.xml中使用案例 简介&#xff1a;在常见的开发中&#xff0c;对于参数的装载一般使用map类型方式&#xff0c;这样可以避免创建很多参数实体类&#xff0c;不管嵌套多层的数据参数都可以通过map拿取&#xff0c;对于嵌套多层的map&#xff0c;我们需…

day-33 收集垃圾的最少总时间

思路 利用一个二维数组&#xff08;数组行数为3&#xff0c;分别对应三种垃圾&#xff09;记录垃圾数量&#xff0c;arr[0][i]表示第i个房子的金属、纸和或玻璃垃圾。 解题方法 将三种垃圾数量&#xff08;值与时间相同&#xff09;相加&#xff0c;最后对应垃圾车最远需要走到…

stm32f103c8t6之4x4矩阵按键

基于普中精灵开发板 1、矩阵按键原理 当我们需要使用较多的按键时&#xff0c;单片机的IO口可能不够用,这是就需要使用矩阵按键。 对应IO口如下&#xff1a; 步骤解析&#xff1a; 1、全部按键都没有按下时&#xff0c;全行IO为低电平&#xff08;全列对应的IO设置为下拉低…