IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> c++实现对内存泄露的检测——windowns以及ubuntu下 -> 正文阅读

[系统运维]c++实现对内存泄露的检测——windowns以及ubuntu下

vs2019内存泄露检测的方法(参考文章):https://blog.csdn.net/qq_45662588/article/details/118388328
函数参数说明:https://blog.csdn.net/gongluck93/article/details/78676996

一、windowns下的vs2019的内存泄露检测

底下说明信息可以不用看,是帮助我自己便于理解的,

  1. 将堆信息映射到调试版本:#define CRTDBG_MAP_ALLOC
  2. 增加头文件信息:stdlib.h、crtdbg.h
  3. 实现内存检测方法,虽然说是实现,其实是固定,EnableMemLeakCheck调用了系统的_CrtSetDbgFlag方法:_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF)
    • 设置位(打开),该应用程序可指示调试堆管理器执行特殊的调试操作,包括在应用程序退出时检查内存泄露并报告是否找到任何内存泄露、通过指定已释放的内存块应保留在堆的链接列表中来模拟内存不足情况;
    • _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF)
    • 参数是新状态的标志位,返回的是前一状态的标志位;
    • _CRTDBG_LEAK_CHECK_DF:表示的是如果应用程序未能释放其所分配的所有内存,则生成错误报告
    • _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)以获取当前_crtDbgFlag状态
  4. 内存泄露结尾调用的地方,做一个标记:_CrtDumpMemoryLeaks();
位域默认描述
_CRTDBG_ALLOC_MEM_DF打开打开:启用调试堆分配并使用内存块类型标识符,例如 _CLIENT_BLOCK。 关闭︰ 将新的分配添加到堆的链接列表,但设置阻止类型设置为**_IGNORE_BLOCK**。 还可以与任何堆频率检查宏组合。
_CRTDBG_CHECK_ALWAYS_DF关闭打开︰ 调用_CrtCheckMemory在每次分配和解除分配请求。 关闭:必须显式调用 _CrtCheckMemory。 设置此标志后,堆频率检查宏不会产生任何影响。
_CRTDBG_CHECK_CRT_DF关闭打开:包括泄漏检测和内存状态差异操作中的 _CRT_BLOCK 类型。 关闭:这些操作将忽略运行时库在内部使用的内存。 还可以与任何堆频率检查宏组合。
_CRTDBG_DELAY_FREE_MEM_DF关闭打开︰ 将已释放的内存块在堆链接列表中,将它们分配**_FREE_BLOCK**键入,然后使用字节值 0xDD 填充它们。 关闭:不要将已释放的块保留在堆链接列表中。 还可以与任何堆频率检查宏组合。
_CRTDBG_LEAK_CHECK_DF关闭打开︰ 执行自动泄露检查在程序退出时通过调用_CrtDumpMemoryLeaks ,则生成错误报告,如果应用程序未能释放其所分配的所有内存。 关闭:不要在程序退出时自动执行泄露检查。 还可以与任何堆频率检查宏组合

函数名助记
CRT就是标准的C函数,Alloc表示的是返回一个指向n个连续字符存储单元的指针,
Dump表示的是垃圾

1. 先检测是哪一块内存泄露

增加了

#define CRTDBG_MAP_ALLOC  
#include <stdlib.h>  
#include <crtdbg.h>  
//在入口函数中包含 _CrtDumpMemoryLeaks();  
//即可检测到内存泄露

//定义函数:
inline void EnableMemLeakCheck()
{
	_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
}
//该函数可以放在主函数的任意位置,都能正确的触发内存泄露输出


//以如下测试函数为例:
int main()
{
	EnableMemLeakCheck();
	char* pChars = new char[10];
	_CrtDumpMemoryLeaks();
	return 0;
}

如图所示可以看出是191次申请内存没有被释放,产生了内存泄露。
在这里插入图片描述

2. 追踪异常

根据前面第几次内存申请,我们可以进行如下设置:

  1. 同样的映射标志;
  2. 同样的头文件包含
  3. 将内存泄露检测的函数EnableMemLeakCheck换为_CrtSetBreakAlloc(第几次内存申请);
#define CRTDBG_MAP_ALLOC  
#include <stdlib.h>  
#include <crtdbg.h>  

int main()
{
	_CrtSetBreakAlloc(191);
	char* pChars = new char[10];
	_CrtDumpMemoryLeaks();
	return 0;
}

运行之后如图所示,会将内存泄露的申请内存的地方调试界面调出来,其实就是保存了那时候的堆栈信息
在这里插入图片描述

二、linux下使用clion进行内存泄露的检查

在linux有成熟免费的产品valgrind使用,专门用于检测内存泄漏,并且可以直接追踪到相关的位置,并且在clion中还集成了该工具,打一下广告,windonws下c++开发推荐vs2022,而linux下就推荐clion,并且clion是可以远程服务器,如果有本地服务器也推荐使用clion。

1. 环境使用

ubuntu20下进行安装(其他版本版本也是没有问题的)

2. 安装

sudo apt install valgrind

3. 在clion中进行设置

进入设置中进行设置,setting–>构建–>动态分析–>valgrind

  • 不过在ubuntu里会自动设置好,通过apt安装的就和默认的一样;
    在这里插入图片描述

4. 运行

通过valgrind而不是平时的那个,按照1/2步骤就可以完成内存泄漏检测分析

  1. 运行
  2. 查看结果
    在这里插入图片描述
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 13:11:55  更:2022-10-17 13:14:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:46:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码