内存泄露:常见的new创建的对象没有delete释放掉,导致内存的泄露,以后这部分空间将无法再被使用,就会产生Heap Leak。
两种方法检查代码中存在的内存泄漏:使用自带的库和使用工具。
一 使用自带的库crtdbg.h
不用安装工具,但需要不断的手动修改中断位置。
#include <crtdbg.h>
int main()
{
//_CrtSetBreakAlloc(77); //在申请指定内存的位置中断
int *p = new int[10];
_CrtDumpMemoryLeaks();//检查内存泄漏
return 0;
}
在main函数最后加_CrtDumpMemoryLeaks(); 然后debug调试程序,会输出泄露的内存位置。
Detected memory leaks!
Dumping objects ->
{77} normal block at 0x008F5500, 40 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
{77}是内存泄露定位值,有40字节泄露。
在main函数开始加_CrtSetBreakAlloc(77); 然后调试,会在申请指定内存(77)的位置中断。
二、安装工具
下载安装vld-2.5-setup.exe 百度搜索或云盘下载https://pan.baidu.com/s/1FHK7jk87EIzFF-0ipaeCSA
直接默认安装即可。会提示关闭VS,然后自动配置VS。
此工具好像不支持2017(会提示内存泄漏,但不定位行号),需要修改。
用以下VS2017的两个dll替换VLD的。
%programfiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Cpp\dbghelp.dll 到 %programfiles(x86)%\Visual_Leak_Detector\bin\Win32
%programfiles(x86)%\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow\Extensions\Cpp\x64\dbghelp.dll 到 %programfiles(x86)%\Visual_Leak_Detector\bin\Win64
#include "vld.h" 然后调试就会定位行号了。