长沙市建设网站做app软件大概多少钱
文章目录
- 内存泄漏
 - 方案一
 - 方案二:CRT调试
 - 定位代码位置
 - 方法1
 - 方法2
 - 其它问题
 
- 方案三:使用vs诊断工具
 - 方案四:使用工具VLD(Visio Leak Detector)
 - 方案五Cppcheck
 
内存泄漏
内存泄漏:指的是在程序里动态申请的内存在使用完后,没有进行释放,导致这部分内存没有被系统回收,久而久之,可能导致程序内存不断增大,系统内存不足……引发一系列灾难性后果
方案一
#if defined(WIN32) && defined(_MSC_VER) &&  defined(_DEBUG)
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__ )
#define new DEBUG_NEWint main()
{
#if defined(_MSC_VER) && defined(_DEBUG)_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
#endif
.......
} 
方案二:CRT调试
- C 运行时库 (CRT) 调试堆函数
 
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
 
- #include必须按照以上所示顺序。
 - #define语句将 CRT 堆函数的基版本映射到对应的“Debug”版本。能获取较为详细的内存泄漏转储信息。
 - crtdbg.h:将 malloc 和 free 函数映射到其“Debug”版本 _malloc_dbg 和 _free_dbg,这些函数将跟踪内存分配和释放。此映射只在调试版本(在其中定义了_DEBUG)中发生。发布版本使用普通的malloc 和 free 函数。
 - 在编译时要把工程属性中的“代码生成”中的“运行时库”改为:“多线程调试(/MTd)”。
 
- 转储内存泄漏信息:在main函数最后面一行,加上一句
_CrtDumpMemoryLeaks() 
#define new  new(_CLIENT_BLOCK, __FILE__, __LINE__)int main()
{........._CrtDumpMemoryLeaks();return 0;
}
 
- 在“输出”窗口中选择包含文件名和行号的行,然后按 F4 键即可进入到源文件中分配内存的行。
 
Microsoft:使用 CRT 库查找内存泄漏
 VS检测内存泄漏,定位泄漏代码位置方法
 使用_CrtSetDbgFlag检测内存泄露
定位代码位置
方法1
在main函数第一行加上:_CrtSetBreakAlloc(453)\ _crtBreakAlloc = 18
方法2
-  
选择" 多线程调试(/MTd)"运行库(静态链接)

 -  
按F11启动程序,程序会停在入口点。
 -  
此时调出Watch窗口,
静态链接 在name项中输入_crtBreakAlloc,在value项中输入你要定位的内存分配编号;
动态链接 在name项中输入{,,msvcr90d.dll}_crtBreakAlloc,在value项中输入内存分配号。注意msvcr90d.dll是vc2008环境使用的运行库dll,若你用的是其他版本vc,请换成对应版本的dll。 
如name无法识别,可尝试下述:
 {,,ucrtbased.dll}_crtBreakAlloc
 _CrtSetBreakAlloc
 {,,msvcrtd.dll}_crtBreakAlloc
 (int*){,,msvcr120d.dll}_crtBreakAlloc
- 现在按F5运行,程序就会自动定位到你要调试的内存分配语句,这时候看call stack的信息会很有帮助。
 
VC使用_crtBreakAlloc快速定位内存泄漏所在代码
 VC++/Qt Creator内存泄漏检测方法(1):_CrtSetDbgFlag与_CrtDumpMemoryLeaks
其它问题
VS编译程序缺失msvcp140d.dll、vcruntime140d.dll和ucrtbased.dll解决方法
方案三:使用vs诊断工具
VS2017的C++开发心得(十一)调试——内存溢出和内存泄漏(上)
方案四:使用工具VLD(Visio Leak Detector)
下载VLD:https://kinddragon.github.io/vld/
在main.cpp中引入
#pragma comment(lib,"F:/Program Files (x86)/Visual Leak Detector/lib/Win32/vld.lib")
#ifdef _DEBUG
#include "F:/Program Files (x86)/Visual Leak Detector/include/vld.h"
#endif
 
方案五Cppcheck
https://cppcheck.sourceforge.io/
C/C++ 内存泄漏检测工具汇总
