C++ Microsoft Visual Studio 2017 检测内存泄漏的最佳和最简单方法?
C++ Microsoft Visual Studio 2017 best and easiest way to detect memory leaks?
目前我有一个解决方案,但我不确定它是否适用于所有情况。我可以使用此解决方案检查程序中是否存在内存泄漏吗?如果有人可以提供更好的解决方案,请不要犹豫,分享答案。谢谢!
我的示例代码在这里:
int *array = new int[5];
delete[] array; //so no memory leaks
//Memory leak check.
if (_CrtDumpMemoryLeaks()) {
std::cout << "Memory leaks!\n";
}
else {
std::cout << "No leaks\n";
}
cin.get();
return 0;
在您的情况下,最适合的是您首先使用的 CRT
库以及 _CrtDumpMemoryLeaks();
的使用,如 Microsoft 文档所述:
The _CrtDumpMemoryLeaks function determines whether a memory leak has occurred since the start of program execution.
关于您的其他疑问:
but I am not sure if it's alright in every scenario
根据微软文档,它应该记录整个程序中发生的任何内存泄漏,即使它在 class 或您可能认为的任何地方:
Dumps all the memory blocks in the debug heap when a memory leak has occurred
另外不要忘记 #define
此处提到的 _DEBUG
标志:
When _DEBUG is not defined, calls to _CrtDumpMemoryLeaks are removed during preprocessing.
但是如果您正在制作软件,您应该使用 STL 并使用智能指针。
您可能还有另一种方法来一次检查某个资源的内存泄漏,我在调试时使用 visual studio 提供的内存选项卡,它位于 debug > windows > memory > memory1 (注意:你必须处于调试模式才能看到设置)然后在搜索栏中你可以输入 array
这样你就可以找到你指向的地方内存存在,然后您可以进入您的程序并查看内存是否已清零。
注:
如果您想一次以可视方式监视一个资源,而不是如果您想要每个可能泄漏的资源的完整转储,这会更多。
我找到了另一个解决方案 - 有人同意吗?(来源:https://docs.microsoft.com/en-us/visualstudio/profiling/memory-usage?view=vs-2017)
第一步 - 创建 3 个断点。 !!!最后一个断点应该放在 return 之后 - 不在行中!
第二步 - 开始调试和创建快照。 (诊断工具)
第三步 - 点击第二个快照,看到3个变量在堆中动态分配。
第四步 - 单击我们制作的第三个快照 - 所以我们在释放 'a' 指针的内存后拍摄它:删除 a;这就是为什么这里的大小只有 8 个字节。 (12 字节 - 我们刚刚发布的 4 字节)
目前我有一个解决方案,但我不确定它是否适用于所有情况。我可以使用此解决方案检查程序中是否存在内存泄漏吗?如果有人可以提供更好的解决方案,请不要犹豫,分享答案。谢谢!
我的示例代码在这里:
int *array = new int[5];
delete[] array; //so no memory leaks
//Memory leak check.
if (_CrtDumpMemoryLeaks()) {
std::cout << "Memory leaks!\n";
}
else {
std::cout << "No leaks\n";
}
cin.get();
return 0;
在您的情况下,最适合的是您首先使用的 CRT
库以及 _CrtDumpMemoryLeaks();
的使用,如 Microsoft 文档所述:
The _CrtDumpMemoryLeaks function determines whether a memory leak has occurred since the start of program execution.
关于您的其他疑问:
but I am not sure if it's alright in every scenario
根据微软文档,它应该记录整个程序中发生的任何内存泄漏,即使它在 class 或您可能认为的任何地方:
Dumps all the memory blocks in the debug heap when a memory leak has occurred
另外不要忘记 #define
此处提到的 _DEBUG
标志:
When _DEBUG is not defined, calls to _CrtDumpMemoryLeaks are removed during preprocessing.
但是如果您正在制作软件,您应该使用 STL 并使用智能指针。
您可能还有另一种方法来一次检查某个资源的内存泄漏,我在调试时使用 visual studio 提供的内存选项卡,它位于 debug > windows > memory > memory1 (注意:你必须处于调试模式才能看到设置)然后在搜索栏中你可以输入 array
这样你就可以找到你指向的地方内存存在,然后您可以进入您的程序并查看内存是否已清零。
注: 如果您想一次以可视方式监视一个资源,而不是如果您想要每个可能泄漏的资源的完整转储,这会更多。
我找到了另一个解决方案 - 有人同意吗?(来源:https://docs.microsoft.com/en-us/visualstudio/profiling/memory-usage?view=vs-2017)
第一步 - 创建 3 个断点。 !!!最后一个断点应该放在 return 之后 - 不在行中!
第二步 - 开始调试和创建快照。 (诊断工具)
第三步 - 点击第二个快照,看到3个变量在堆中动态分配。
第四步 - 单击我们制作的第三个快照 - 所以我们在释放 'a' 指针的内存后拍摄它:删除 a;这就是为什么这里的大小只有 8 个字节。 (12 字节 - 我们刚刚发布的 4 字节)