『Others』内存泄漏检查工具

2024-01-31 00:32

本文主要是介绍『Others』内存泄漏检查工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是内存泄漏

简单来说,内存泄漏就是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
对于C/C++程序猿更要注意这个问题,因为C/C++程序中,动态申请的内存都需要程序猿自己手动释放。不像Java有垃圾回收机制,所以作为一名C/C++程序猿,了解几个内存泄漏检查工具还是很有必要的。

Windows下的内存泄漏检测工具

Visual Studio 2013自带的内存泄漏检测工具

#include <iostream>
using namespace std;int main(){int* ptr = new int[10];system("pause");return 0;
}

main函数的最后一行加上一句_CrtDumpMemoryLeaks();调试程序,结束后查看输出。注意要包含头文件#include <crtdbg.h>注意_CrtDumpMemoryLeaks();要加在return 0;之前。

#include <iostream>
#include <crtdbg.h>
using namespace std;int main(){int* ptr = new int[10];_CrtDumpMemoryLeaks();system("pause");return 0;
}

在这里插入图片描述
记住方括号中的编号148。我们在main()函数第一行加上_CrtSetBreakAlloc(148);意思就是在申请148这块内存的位置中断

#include <iostream>
#include <crtdbg.h>
using namespace std;int main(){_CrtSetBreakAlloc(148);int* ptr = new int[10];_CrtDumpMemoryLeaks();system("pause");return 0;
}

然后调试程序。程序中断时,查看调用堆栈
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自带的内存泄漏检查工具使用太过麻烦,下面介绍一种更好用的工具

VLD(Visual Leak Detector)内存泄漏库

VLD使用起来非常简单,只需在要测的源文件中加入#include <vld.h>头文件。然后运行程序就可以发现内存问题
首先下载安装VLD
下载链接
提取码:h9f6
在这里插入图片描述
全部勾选即可,然后无脑next即可,直到finish。和以前的版本不一样,VLD会将自己配置在VS上,所以我们现在不用再对自己的项目进行对VLD头文件和library库文件的添加配置。打开项目属性就可以看到。
在这里插入图片描述
我们需要用的时候只需要添加头文件#include <vld.h>就可以。

#include <iostream>
#include <vld.h>
using namespace std;int main(){int* ptr = new int[10];system("pause");return 0;
}

选择Debug模式,运行即可
在这里插入图片描述
但是,我这里优点问题,这个程序是有内存泄漏的,理论上应该能检测出来,但是并没有(O(∩_∩)O哈哈~)有知道为什么的欢迎指点

Linux下的内存泄漏检查工具

valgrind

安装

[sss@aliyun test]$ sudo yum install valgrind

在这里插入图片描述
验证是否安装成功

[sss@aliyun test]$ valgrind ls -l
==19705== Memcheck, a memory error detector
==19705== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==19705== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==19705== Command: ls -l
==19705== 
total 8
-rw-rw-r-- 1 sss sss 84 May 26 08:59 class.cc
-rw-rw-r-- 1 sss sss 69 May 28 13:41 test.cc
==19705== 
==19705== HEAP SUMMARY:
==19705==     in use at exit: 19,417 bytes in 8 blocks
==19705==   total heap usage: 202 allocs, 194 frees, 74,590 bytes allocated
==19705== 
==19705== LEAK SUMMARY:
==19705==    definitely lost: 0 bytes in 0 blocks
==19705==    indirectly lost: 0 bytes in 0 blocks
==19705==      possibly lost: 0 bytes in 0 blocks
==19705==    still reachable: 19,417 bytes in 8 blocks
==19705==         suppressed: 0 bytes in 0 blocks
==19705== Rerun with --leak-check=full to see details of leaked memory
==19705== 
==19705== For counts of detected and suppressed errors, rerun with: -v
==19705== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

输入命令valgrind ls -l出现上述信息,表示安装成功
使用说明
Valgrind工具包包含多个工具,如Memcheck、Cachegrind、Helgrind、Callgrind、Massif等等。
演示代码

#include <iostream>int main(){int* ptr = new int;return 0;
}

首先编译程序,注意加上-g选项,保留调试信息

[sss@aliyun test]$ g++ -g test.cc -o test

valgrind直接工作于可执行文件上,因此在检查前不需要重新编译、链接和修改程序
命令格式如下

valgrind --tool=tool_name program_name

比如说,对ls -l命令做内存检查

[sss@aliyun test]$ valgrind --tool=memcheck ls -l

下面是使用valgrind检测是否有内存泄漏

[sss@aliyun test]$ valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes    ./test

其中

  • --leak-check=full指的是完全检查内存泄漏
  • --show-reachable=yes显示内存泄漏的地点
  • --trace-children=yes跟入子进程

当程序正常退出后,valgrind就会输出内存泄漏的信息。
在这里插入图片描述
Linux下还有很多内存泄漏检查工具,比如说:mtrace、dmalloc、Kmemleak等等。这里就不一一举例介绍了。感兴趣的可以自己去了解下

这篇关于『Others』内存泄漏检查工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/662041

相关文章

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo