C++ 在C+中查找内存泄漏+;visualstudio应用程序
在Linux中,我一直在使用valgrind检查应用程序中是否存在内存泄漏。Windows中的等效项是什么?使用VisualStudio 2010? 可以使用DevPartner工具在VisualStudio.c++中找到C++应用程序中的内存泄漏。p> 怎么样?它不是内置的,但我确实认为它是最流行的。在使用Visual Studio、Delphi和其他编译器构建的本机Windows程序中查找内存并处理泄漏。速度快,可以处理大量工作负载(一些用户在一次运行中跟踪数十亿次分配和释放)C++ 在C+中查找内存泄漏+;visualstudio应用程序,c++,visual-studio,visual-studio-2010,memory-leaks,valgrind,C++,Visual Studio,Visual Studio 2010,Memory Leaks,Valgrind,在Linux中,我一直在使用valgrind检查应用程序中是否存在内存泄漏。Windows中的等效项是什么?使用VisualStudio 2010? 可以使用DevPartner工具在VisualStudio.c++中找到C++应用程序中的内存泄漏。p> 怎么样?它不是内置的,但我确实认为它是最流行的。在使用Visual Studio、Delphi和其他编译器构建的本机Windows程序中查找内存并处理泄漏。速度快,可以处理大量工作负载(一些用户在一次运行中跟踪数十亿次分配和释放) 公开:我是C
公开:我是C++内存验证程序的设计者。我们之所以构建它,是因为当我们与SolidWorks R&D Ltd.合作时,其他工具无法处理工作负载。
Visual Studio 2015及更高版本具有本机内存泄漏诊断工具,查看此项了解详细信息:.是一种内存监控工具,能够识别与内存相关的编程错误,例如访问未初始化内存、访问不可寻址内存(包括分配的堆单元外部和堆下溢和溢出)、访问已释放内存、双重释放、内存泄漏和(在Windows上)处理泄漏、GDI API使用错误以及对未保留线程本地存储插槽的访问 Dr.Memory在未经修改的应用程序二进制文件上运行,这些二进制文件运行在Windows、Linux、Mac或Android上的IA-32、AMD64和ARM硬件上Dr.Memory是建立在dynamic instrumentation tool平台上的。是检测本机(c或c++)应用程序泄漏的好工具。您可以将其与Visual studio或Windbg一起使用。Aaprt从内存泄漏开始,您可以检查堆损坏、无效句柄使用情况。将应用程序验证器与windbg(!analyze-v)一起使用提供了很好的洞察力。Visual Studio 2019有一个不错的内存分析工具,它可以在调试时交互使用,也可以通过编程(无需调试)使用。下面我将展示两种情况下的一个最小示例 其主要思想是在进程开始和结束时对堆进行快照,然后比较内存状态以检测潜在的内存泄漏 交互地 创建以下
main.cpp
文件(在新的控制台应用程序中):
它做同样的事情,但是通过代码,所以您可以将其集成到自动构建系统中,函数获取快照并比较快照的内存状态,如果它们不同,则返回true
既然是这样,它就进入条件块,并通过几个函数打印有关泄漏的详细信息(请参阅和-后者不需要快照)
要查看输出,请在最后一行“return0”中放置一个断点,点击F5
,然后查看调试控制台。以下是输出:
要获取更多信息,请参阅以下链接:
- 互动分析:
- 通过编程:和(也用于堆损坏)
如果你喜欢在头上钻孔取乐,那当然。的可能副本已移动到,然后在2017年被明显放弃。似乎仍然适用于VS 2019,请参见此处:社区版中是否也提供此功能?我的VS 2017社区版中提供此功能,关于2015年还不确定。按照页面上的说明,我得到了“Dr.Memory internal crash”的任何建议?如果可行,DrM是很好的,但就像其他人发现的一样,Feb 2020 2.3.0.1容易出现内部SEGFULTS。这非常好。有没有办法查一查。混合数组
new[]
和错误的delete
,2。访问释放的内存,3。其他破坏内存的方法,如越界访问等。4.访问未初始化的内存我不知道1,3和4,但我会使用静态分析工具。关于2(访问释放的内存),您可以使用\u CRTDBG\u DELAY\u FREE\u MEM\u DF
标志(请参阅上面的链接“CRT调试堆文件”)。谢谢OutputDebugStringW
是LPCWSTR
所需的(3个字符不足以编辑,因为答案的其余部分是完美的!)/fsanize=address
现在可以与x64和x86一起用于类似的内存问题。
#include <string.h>
int main()
{
int a = 1;
char* s = new char[17];
strcpy_s(s,17,"stackoverflow_pb");
char* ss = new char[14];
strcpy_s(ss, 14,"stackoverflow");
delete[] ss;
return 0;
}
#include <iostream>
#include "windows.h"
#define _CRTDBG_MAP_ALLOC //to get more details
#include <stdlib.h>
#include <crtdbg.h> //for malloc and free
int main()
{
_CrtMemState sOld;
_CrtMemState sNew;
_CrtMemState sDiff;
_CrtMemCheckpoint(&sOld); //take a snapchot
char* s = new char[17];
strcpy_s(s, 17, "stackoverflow_pb");
char* ss = new char[14];
strcpy_s(ss, 14, "stackoverflow");
delete[] ss;
_CrtMemCheckpoint(&sNew); //take a snapchot
if (_CrtMemDifference(&sDiff, &sOld, &sNew)) // if there is a difference
{
OutputDebugString(L"-----------_CrtMemDumpStatistics ---------");
_CrtMemDumpStatistics(&sDiff);
OutputDebugString(L"-----------_CrtMemDumpAllObjectsSince ---------");
_CrtMemDumpAllObjectsSince(&sOld);
OutputDebugString(L"-----------_CrtDumpMemoryLeaks ---------");
_CrtDumpMemoryLeaks();
}
return 0;
}