c++ - 在 Visual Studio 2012 中执行完 C++ 程序后,内存泄漏是否仍然存在?

标签 c++ memory-leaks visual-studio-2012

我不是编程新手,而是 C++ 新手。我发现当我玩和与语言互动时,我学得更好。所以我发现的一件很酷的事情是如何让 Visual Studio 通过以下方式提醒您程序中的任何内存泄漏:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h> 

然后调用

_CrtDumpMemoryLeaks();

在程序退出并将所有内存泄漏打印到输出窗口之前,太棒了!

我的问题是

  • 发现内存泄漏后是否需要重新启动 Visual Studio 2012?
  • 我需要重新启动计算机吗?
  • 这些东西会泄露多久?或者 Windows 会在执行结束时清理所有内存吗?如果这是真的,那么在 Visual Studio 中以“ Debug模式”运行程序是否也是如此?

是的,我知道我真的应该使用像 shared_ptrunique_ptr 等智能指针,但我这样做是为了学习。这不是一个“真正的”应用程序,只是沙盒测试!

还有,_CrtDumpMemoryLeaks()这种查找内存泄漏的方法有没有不能准确找到泄漏的情况?这似乎是一个了不起的工具!

最佳答案

不,内存泄漏在程序中。一旦被调试者终止,VS 或调试器与泄漏的内存无关。除非它是内核内存,否则所有用户模式内存分配都会在进程终止时由操作系统释放。

_CrtDumpMemoryLeaks 在很多情况下都没有用。一旦发生任何内核内存泄漏(在许多情况下都属于句柄泄漏,并且需要 Windows 上的其他工具)。您可能需要查看 WinDbg 和相关工具,如 GFlags(来自 Microsoft 网站免费提供的 Windows 调试工具包),以获得更详尽的诊断内存泄漏/堆损坏等

关于c++ - 在 Visual Studio 2012 中执行完 C++ 程序后,内存泄漏是否仍然存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14554748/

相关文章:

c++ - 在 C++ 中,(int *) 和 & 有什么区别?

c++ - 使用 al_ustr_newf 复制字符串 Allegro 5

c++ - 如何将重载函数作为模板函数参数传递?

java - 为什么 PermGen 空间在增长?

c++ - 链接错误 : Installing boost zlib filters using NuGet in Visual Studio (2012)

C++ SDL 2.0 - 使用循环导入多个纹理

java - 如何修复 MQTT 应用程序的内存泄漏?

.net - 我应该在我的 WPF 应用程序中手动强制垃圾收集吗?

visual-studio-2012 - 每次打开 Visual Studio 时 VMDebugger 加载项都会崩溃

c - 未记录的结构定义和转发