C++ 内存泄漏与valgrind排查

标签: C++

内存泄漏指程序运行过程中,不再被使用的运行时堆内存没有被及时的释放,造成可用空间不断减少

内存泄漏的主要原因有:

  1. 程序在通过malloc new等申请动态内存时,未对应执行free delete
  2. 程序包含free delete 但调用过程中发生异常(控制转移)异常处理中没有进行释放
  3. 程序提前return 遗漏掉free delete的执行

 

linux>top    #查看系统当前进程运行情况 包括内存占用

可以看到其中排在第一个的内存占用是: 11.2%

Linux下Valgrind是一个能够非嵌入的排查程序运行过程中的工具,其中的tool memcheck能够排查程序运行过程中的错误:

其通过模拟一个程序实际运行过程中,监视其访问地址、和访问变量的有效性,来对程序出现的问题做排查:

vaild_value_map:记录着寄存器和内存中各个位置的值是否是已经初始化、有效的值

vaild_address_map:记录着进程地址空间中地址是否有效
linux>touch demo.cpp
linux>gedit demo.cpp

//创建一个demo.cpp   内容如下

void fun()
{
   int *p=new int[1024];
}
int main()
{
   fun();
   fun();
   fun();
}


linux>g++ demo.cpp -o demo -g    #编译链接生成demo 注意-g  

注意这里g++ 编译选项带 -g  那么生成的demo可执行目标文件中会包含源代码等信息 用于调试

linux>valgrind --tool=memcheck --leak-check=full ./demo

# --tool 指明使用memcheck工具      最后 ./demo 是待检查程序的启动命令

 

可以看到Memcheck 显示一个内存错误被探测到  有三块Heap内存没有被及时的free 

版权声明:本文为qq_33369979原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33369979/article/details/109381489

智能推荐

Linux中使用Valgrind进行C/C++内存检测

Linux中的C/C++内存检测 1.使用Valgrind工具 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。它包含一个内核,也就是一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。C/C++内存检测,我们可以使用它的工具:Memcheck。 安装方法: 1)从官网http://valgrind.org下载最新版本(当...

Linux C/C++下内存泄露检查神器Valgrind

项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务起不来。实际上,使用C/C++这类没有垃圾回收机制的语言时,你很多时间都花在处理如何正确释放内存上。为以后更方便的检测内存泄漏问题,于是学习使用了valgrind来对内存泄漏进行检测。 Valgrind是linux环境下的一款功能齐全的内存调试和性能分析工具集,它包括Memcheck、Callg...

CV笔记03:自监督GAN(ss-gan)

无需标注数据,利用辅助性旋转损失的自监督GANs,-- 对抗+自监督的无监督方式 《通过辅助旋转损失进行的自监督GAN》CVPR 2019 论文速看 0.摘要 目前自然图像合成主要是条件GAN,但是其缺点是需要标注数据。 我们利用两种流行的无监督学习技术,对抗训练和自我监督,并朝着缩小有条件GAN和无条件GAN之间的差距迈出了一步。 我们允许网络在代表学习的任务上进行协作,同时相对于经典GAN博弈...

题目练习

题目: 解决的代码: 注意:链表指针在操作以后记得移动...

Retrofit(三)上传文件

想了想,觉得还是把自定义的东西放到最后再讲,所以讲下用Retrofit上传文件,就拿上传图片来说,因为上传图片我是想写一个专题的,包括以下: 1.上传图片操作 2.展示图片操作 3.选择图片操作 上传图片这篇讲,用Retrofit,之后我还想写一篇是用httpurlconnection的,因为用它会有个拼接的操作,只有经历过拼接才会更深刻的了解使用Http上传文件的过程。展示图片我其实已经写完了,...

猜你喜欢

Linux安装SQL2019

官方文档 导入公共存储库 GPG **: 为 SQL Server 2019 注册 Microsoft SQL Server Ubuntu 存储库: 使用以下命令进行安装 SQL2019: 包安装完成后,运行 mssql-conf setup,按照提示设置 SA 密码并选择版本,并执行以下命令: 完成配置后,验证服务是否正在运行:...

vue-cli使用vscode编辑器如何自动eslint检测

VSCode 保存时自动ESlint格式化 Eslint 自动格式化 首先安装ESLint插件 2.安装完成后,每次修改完代码都需要执行 "npm run lint"之后才能格式化 打开设置选项 编辑代码settings.json 新建.eslintrc.js文件 根据eslint官网规则(eslint官网),编写eslintrc.js文件 保存之后,今后在保存时就能自动ESL...

搭建VUE脚手架(二)---修改完善cli3

光创建完cli3脚手架只是成功了一半,现在还无法直接使用(确切地说还不好用),还需要继续改造 这是本文修改后项目的目录结构,创建文件时可以参考。 1.创建vue.config.js 2.创建常量配置文件(.env.development和.env.production),用于存放常量 .env.development .env.production 3.ESLink配置(别问为什么,问就是我严格语...

hadoop-zookeeper-hive-flume-kafka-hbase集群,解决登录报错,Cli.sh启动失败,Error: java.lang.UnsupportedClassVersion

1.克隆虚拟机之前清理垃圾 2.选中“克隆虚拟机”:“右键→管理→克隆” 弹窗 操作 1 下一步 2 克隆自:虚拟机中的当前状态 3 创建完整克隆 4 虚拟机命名,选择存储位置 5 完成 3.配置IP 3.1获取地址:vi /etc/udev/rules.d/70-persistent-net.rules 3.2修改本机IP:vi...

访问日志

1.访问日志不记录静态文件        一个网站会有很多元素,比如图片、js、css等静态文件比较多,用户每请求一个页面就会访问很多的静态元素,这些元素的请求都会被记录到日志中去。如果一个网站访问量比较大,那么访问日志就会增加的非常快,甚至一天就可以达到几个GN。这不仅会对服务器的磁盘空间造成影响,更重要的是会影响磁盘的读写速度。    ...