首页

文章

VS2015编写C++查找内存泄漏怎么显示出来文件名和行号

发布网友 发布时间:2022-04-19 14:10

我来回答

1个回答

热心网友 时间:2023-08-18 14:48

技术原理
检测内存泄漏的主要工具是调试器和 CRT 调试堆函数。若要启用调试堆函数,请在程序中包括以下语句:
#define CRTDBG_MAP_ALLOC
#include
#include
注意 #include 语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作。

通过包括 crtdbg.h,将 malloc 和 free 函数映射到其“Debug”版本_malloc_dbg 和_free_dbg,这些函数将跟踪内存分配和释放。此映射只在调试版本(在其中定义了 _DEBUG)中发生。发布版本使用普通的 malloc 和 free 函数。

#define 语句将 CRT 堆函数的基版本映射到对应的“Debug”版本。并非绝对需要该语句,但如果没有该语句,内存泄漏转储包含的有用信息将较少。

在添加了上面所示语句之后,可以通过在程序中包括以下语句来转储内存泄漏信息:
_CrtDumpMemoryLeaks();
当在调试器下运行程序时,_CrtDumpMemoryLeaks 将在“输出”窗口中显示内存泄漏信息。内存泄漏信息如下所示:
Detected memory leaks!

Dumping objects ->

C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.

Data: <        > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object mp complete.

如果不使用 #define _CRTDBG_MAP_ALLOC 语句,内存泄漏转储如下所示:Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object mp complete.

未定义 _CRTDBG_MAP_ALLOC 时,所显示的会是:

内存分配编号(在大括号内)。
块类型(普通、客户端或 CRT)。
十六进制形式的内存位置。
以字节为单位的块大小。
前 16 字节的内容(亦为十六进制)。
定义了 _CRTDBG_MAP_ALLOC 时,还会显示在其中分配*存的文件。文件名后括号中的数字(本示例中为 20)是该文件内的行号。

转到源文件中分配内存的行

在"输出"窗口中双击包含文件名和行号的行。
-或-

在"输出"窗口中选择包含文件名和行号的行,然后按 F4 键。
_CrtSetDbgFlag

如果程序总在同一位置退出,则调用 _CrtDumpMemoryLeaks 足够方便,但如果程序可以从多个位置退出该怎么办呢?不要在每个可能的出口放置一个对 _CrtDumpMemoryLeaks 的调用,可以在程序开始包括以下调用:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

该语句在程序退出时自动调用 _CrtDumpMemoryLeaks。必须同时设置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF 两个位域,如上所示。

说明
在VC++6.0的环境下,不再需要额外的添加
#define CRTDBG_MAP_ALLOC
#include
#include

只需要按F5,在调试状态下运行,程序退出后在"输出窗口"可以看到有无内存泄露。如果出现
Detected memory leaks!
Dumping objects ->

就有内存泄露。

确定内存泄露的地方
根据内存泄露的报告,有两种消除的方法:

第一种比较简单,就是已经把内存泄露映射到源文件的,可以直接在"输出"窗口中双击包含文件名和行号的行。例如
Detected memory leaks!
Dumping objects ->
C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object mp complete.
C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20)

就是源文件名称和行号。
历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 有哪些经典的 Web 前端或者 JavaScript 面试笔试题 如何定位分析linux内存泄漏问题 JAVA防止内存的泄漏什么意思,内存还能泄露? 如何使用 fbretaincycledetector linux内存泄漏如何定位 如何快速定位android app是否存在内存泄露 求助:vs2003下如何查找内存泄漏 怎样查找内存泄漏问题? Android开发中,有什么工具能够排查jni层的内存泄漏 c++怎么查找内存泄漏 如何通过jProfile来分析是否存在内存泄漏 如何使用 umdh.exe 来查找内存泄漏 如何使用JProfiler查找内存泄漏 android怎么查找内存泄漏 怎么排查这些内存泄漏 如何检测内存泄漏 vc6.0中如何查找内存泄露 异形2014小说txt全集免费下载 联想G410win7系统,安装WIN8虚拟机就卡在了这个界面。 摄像机拍到白色影子到底是什么还会晃动、已经是第... 手机钉钉直播可以从屏幕共享里面听别人讲的视频吗 xs运行内存是多少 苹果xs运行内存多大 在哪里可以查看 苹果xsmax64G运行速度慢吗 甲油胶里面的彩胶怎么用 彩油胶跟甲油胶有什么不同的吗? 甲油胶和彩胶的区别 甲油胶 彩蔻甲油胶好用吗? 康淳甲油胶的美甲彩胶怎么样,上色效果好吗? Kasi甲油胶怎么区分底胶和封层?(甲油胶怎么区分... 康淳甲油胶的PUF点彩胶套餐怎么样,实用吗? 涂甲油胶封层要不要超过颜色 彩罗甲油胶怎么样 光疗甲封层、底胶和QQ甲油胶的封层、底胶是不一样... 为什么做好的甲油胶会容易掉。 女生没学历学什么技术好? 30岁,还能学什么技术呢? 女生35岁还能学习什么技能? 居家办公,想办理中国电信的宽带套餐,有哪几种套餐? 请问iPhone XS Max 256 A12仿生。是多大的运行内存
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com