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

2025-04-14 05:57:15
推荐回答(4个)
回答1:

假如在含有以上代码的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();
假如程序有不止一个出口,那么我们就需要在多个地方都调用该函数。

回答2:

跟踪new,F11一步步进去,有个地方会有lRequest和size,lRequest就是报的那个内存泄露id和size。加上条件断点,重启,大多数情况可以得出结果,有时由于每次启动给对象分配的id会变,也不好抓到。

回答3:

在c++中,少了一个分号就是少了整个程序。。。      

回答4:

我都用智能指针 大型程序都有专门的类来管理