使用VS2013编写c++程序时怎样检测内存泄漏

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用VS2013编写c++程序时怎样检测内存泄漏相关的知识,希望对你有一定的参考价值。

假如在含有以上代码的cpp文件中分配内存后没有进行释放,那么当你停止程序的时候,VisualStudio的Output窗口就会出现提示的信息,可以试着在里面加一句
int* p = new int;
接着调试工程,运行结束后你会看到在Output窗口里会输出1:Detected memory leaks!2:Dumping objects -3:e:\学习\de\de\de.cpp(20) : 290 normal block at 0x004CD7F8, 4 byteslong.4:Data: < CD CD CD CD5:Object dump complete.6:The program
'[11088] de.exe: Native'
has exited with code 0 (0x0).
这是告诉我们在20行有内存泄漏,双击就会跳到相应的代码行!
我试了下用VisualStudio建立的Win32 Console Application和Win32 Project项目,结果都不能检测出内存泄露。
我们将会使用到里面很重要的几个函数。其中最重要的是 _CrtDumpMemoryLeaks使用这个函数,需要包含头文件crtdbg.h
该函数只在Debug版本才有用,当在调试器下运行程序时,_CrtDumpMemoryLeaks 将在“Output(输出)”窗口中显示内存泄漏信息.写段代码试验一下吧,如下:
这个就会在Output窗口输出如下信息:
虽然输出了有内存泄漏,但是无法看出是那里泄漏了,然后下来看看我们的第二个版本的代码:
它会在Output输出:
已经很清楚我告诉我们是在17行产生的。
然后我们把代码修改正确:1:int_tmain(intargc, _TCHAR* argv[])2:3:int* p =newint;4:deletep;5:_CrtDumpMemoryLeaks();6:return0;7:运行后,输出的信息就是正确的了。
所以在写代码的时候除了在产生Dump信息外,最重要的就是在程序退出的时候需要掉用一次_CrtDumpMemoryLeaks();
假如程序有不止一个出口,那么我们就需要在多个地方都调用该函数。
参考技术A 跟踪new,F11一步步进去,有个地方会有lRequest和size,lRequest就是报的那个内存泄露id和size。加上条件断点,重启,大多数情况可以得出结果,有时由于每次启动给对象分配的id会变,也不好抓到。追问

追答

凡是内存泄漏,就是new的内存的没释放。
F11就是调试跟踪。
lRequest就是调试状态下new对象分配的内存id,程序退出后output窗口那个泄露id。size是分配的大小。
条件断点,就是符合一定条件才停下来的断点。
结果就是条件断点激发,调试器暂停。这时候看函数调用堆栈,new函数在哪里,就是哪里内存泄漏。

本回答被提问者和网友采纳
参考技术B 在c++中,少了一个分号就是少了整个程序。。。       参考技术C 我都用智能指针 大型程序都有专门的类来管理追问

怎样用智能指针?STL有智能指针吗?

追答

回复 曌猴未文9 :stl boost都有,不过效率捉急

参考技术D 用带_s的编写就行了,系统会自己检测追问

带_s的是什么?

追答

会自己检测是否泄露比如printf_s

以上是关于使用VS2013编写c++程序时怎样检测内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

怎样发现内存泄露?

如何在linux下检测内存泄漏

如何检测内存泄漏

使用 VS Code 在 C++ 应用程序中查找内存泄漏

使用 Valgrind 检测 C++ 内存泄漏

在合理的时间范围内检测到一定程度内存泄漏的工具