使用 Visual Studio 查找 C++ 应用程序中的内存泄漏

2024-04-07

在Linux中,我一直使用valgrind来检查应用程序中是否存在内存泄漏。 Windows 中的等效项是什么?这可以用 Visual Studio 2010 来完成吗?


Visual Studio 2019 有一个不错的内存分析工具,它可以在调试或编程时以交互方式使用(无需调试),我在下面的两种情况下都展示了一个最小的示例。

主要思想是在进程开始和结束时拍摄堆快照,然后比较内存状态以检测潜在的内存泄漏。

互动式

创建以下内容main.cpp文件(在新的控制台应用程序中):

#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;
}

Then :

  1. 在第一行“int a...”上放置一个断点
  2. 单击“调试”>“Windows”>“显示诊断工具”;并选择内存使用情况
  3. Then debug the code (F5), when the breakpoint is hit, click Take snapshot on the Memory Usage summary toolbar.
  4. Go to the last line "return 0.." (step over (F10) several times) and take another snapshot.
  5. 单击第二个快照中的红色箭头(在“内存使用情况”选项卡中)
  6. 这将打开一个新的“快照”选项卡,允许您将此快照与第一个(或另一个)快照进行比较并检测内存泄漏。在此示例中,变量存在内存泄漏s(stackoverflow_pb)。您可以通过双击“char[]”对象找到它。

上述过程的关键步骤如下图所示:

通过编程

将代码替换为以下内容:

#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 snapshot
    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 snapshot 
    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;
}

它做同样的事情,但是通过代码,所以你可以将它集成到自动构建系统中,功能_CrtMemCheckpoint https://learn.microsoft.com/cpp/c-runtime-library/reference/crtmemcheckpoint?view=vs-2019拍摄快照并_CrtMemDifference https://learn.microsoft.com/cpp/c-runtime-library/reference/crtmemdifference?view=vs-2019比较快照的内存状态,如果不同则返回 true。

既然是这种情况,它就会进入条件块并通过几个函数打印有关泄漏的详细信息(请参阅_CrtMemDumpStatistics https://learn.microsoft.com/cpp/c-runtime-library/reference/crtmemdumpstatistics?view=vs-2019 , _CrtMemDumpAllObjectsSince https://learn.microsoft.com/cpp/c-runtime-library/reference/crtmemdumpallobjectssince?view=vs-2019 and _CrtDump内存泄漏 https://learn.microsoft.com/cpp/c-runtime-library/reference/crtdumpmemoryleaks?view=msvc-160- 后者不需要快照)。

要查看输出,请在最后一行“return 0”中放置一个断点,点击F5并查看调试控制台。这是输出:


要获取更多信息,请参阅以下链接:

  • 互动分析:在 Visual Studio 中测量内存使用情况 https://learn.microsoft.com/visualstudio/profiling/memory-usage?view=vs-2019
  • 通过编程: and CRT 调试堆文件 https://learn.microsoft.com/visualstudio/debugger/crt-debug-heap-details?view=vs-2019(也适用于堆损坏)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Visual Studio 查找 C++ 应用程序中的内存泄漏 的相关文章

  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 在运行时更改标签位置

    如何改变UILabel运行时的位置 Thanks label frame CGRectMake or label center CGPointMake
  • R中不同时间序列数据值的互相关

    我有 5 个地点 15 天的时间序列数据 以日格式 存储为matrix 数据的结构是 meter daywise lt structure c 24 4745528484842 21 5936510486629 58 91208965401
  • 在C中使用AVX实现矩阵运算

    我正在尝试使用 AVX 实现以下操作 for i 0 i
  • 通过代理使用 mySql 抛出异常 原因:java.sql.SQLException:不支持可调用语句。重新连接后

    大家好 我有这个问题 我启动我的应用程序 然后当它运行时我关闭 mysql 服务 当然我开始得到java sql SQLException Callable statements not supported 重新启动 mySql 服务后一切
  • 如何从flutter中的自定义Widget获取价值?

    我正在创建一个需要字符串列表并返回选定字符串的小部件 要多次使用 我创建了这个小部件名称过滤器面板 喜欢选择最喜欢的游戏 电影等 我已经解决了它放置在 showDialog 中 但在这里我不想使用显示对话框 class FilterScre
  • 将媒体查询上的导航栏移至右侧

    我试图在浏览器窗口达到一定大小时将导航栏移动到右侧的固定位置 并在浏览器窗口小于该大小时将其放在顶部 使用下面的代码 如 jsfiddle 中所示 当我调整 html 大小时 导航栏在左侧 而不是右侧 对齐 问题 如何将媒体查询上的导航栏移
  • 如何在不是字典的 json 模式中创建模式引用的嵌套列表(数组)

    所以我有一个类似的问题 参见 如何在 json 模式中创建模式引用的嵌套列表 数组 https stackoverflow com questions 35545812 how do i do a nested list array of
  • 您应该多久发布一次软件更新? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • iOS 上独立 Web 应用程序的调试控制台[重复]

    这个问题在这里已经有答案了 在 iPad 上测试我的 Web 应用程序时 我可以启用 Safari Mobile 的调试控制台并愉快地读取我的日志输出 我找不到对独立应用程序执行相同操作的方法 这意味着 Web 应用程序已 添加到主屏幕 并
  • .NET 中的值类型实际上是如何工作的?

    我在理解 NET 中的值类型表示时遇到问题 每个值类型都派生自 System ValueType 类 那么这是否意味着值类型是一个类 例如 如果我写 int x 5 这意味着我创建了一个实例System Int32类an 将其写入变量x S
  • 如何监听任意端口的广播包?

    使用 NET 如何在任何端口上侦听发送到 255的udp广播数据包 而不需要绑定到特定端口 我自己找到了办法 它是这样工作的 mainSocket new Socket AddressFamily InterNetwork SocketTy
  • JavaScript 访问父对象属性

    我在 JS 中遇到一个小问题 我有两个嵌套对象 我想从父对象访问一个变量 如下所示 var parent a 5 child b 3 displayA function console log this a undefined displa
  • iOS 中的本地通知没有任何声音

    void notifyMe UILocalNotification localNotification UILocalNotification alloc init localNotification fireDate NSDate dat
  • Git:父提交比后代提交年轻?

    我正在浏览http arago project org git projects linux omap3 git http arago project org git projects linux omap3 gitrepo 并遇到了一个奇
  • MASM0015; Web服务HandlerTubeFactory异常

    我正在尝试创建一个可以调用另一个的网络服务链 我已经创建了第一个服务并成功部署在 weblogic12c 上 当第一个 Web 服务尝试调用外部 Web 服务时 出现以下异常 notifyAbout WSTestOuter outer ne
  • 使用 javascript 加载部分 html

    在我的网站上 我加载在服务器 nodejs 上呈现的 html 并将其插入到正确的位置 大多数情况下是带有 id 内容的 div 如何在客户端插入接收到的 html 以便执行包含的脚本标记 我在客户端使用下划线和把手 但 vanillajs
  • 为什么GK110有192个核心和4个扭曲?

    我想感受一下开普勒的架构 但这对我来说没有意义 如果一个 warp 有 32 个线程 其中 4 个被调度 执行 则意味着 128 个核心正在使用 64 个核心处于空闲状态 白皮书中提到了独立指令 那么64核是为这些指令保留的吗 如果是这样
  • 如何从此类图像中删除背景?

    我想删除该图像的背景以仅获取人物 我有数千张这样的图像 基本上是一个人和一个有点发白的背景 我所做的是使用边缘检测器 例如 canny 边缘检测器或索贝尔滤波器 来自skimage图书馆 然后我认为可以做的是 将边缘内的像素变白 并将边缘外
  • 如何在 React + Babel 中允许异步函数?

    我有一个 Typescript React 应用程序 它可以使用 then catch Promise 执行异步函数 但不能使用 async await try catch 执行异步函数 错误是 Uncaught ReferenceErro
  • 使用 Visual Studio 查找 C++ 应用程序中的内存泄漏

    在Linux中 我一直使用valgrind来检查应用程序中是否存在内存泄漏 Windows 中的等效项是什么 这可以用 Visual Studio 2010 来完成吗 Visual Studio 2019 有一个不错的内存分析工具 它可以在