【问题标题】:Why is visual studio Diagnostic Tools showing soo much memory usage?为什么 Visual Studio 诊断工具显示如此多的内存使用情况?
【发布时间】:2023-04-04 01:07:01
【问题描述】:

我写了这段代码:

#include "Colour.h"

int main(int argc, char** argv) {

    //sizeof(Colour) = 3
    Colour* data = new Colour[8 * 8];

    for (int y = 0; y < 8 * 8; y++)
    {
        data[y] = Colour::WHITE;
    }
}

在这个例子中,Color 是一个 3 个字节大的结构

因此,我希望该程序分配8 * 8 * 3 = 192 字节。 但是在诊断工具面板中,它显示了889 kB 的用法?

奇怪的是,当我深入挖掘时,通过创建内存快照,它显示的堆大小为71kB。但是在查看源代码时,它只显示了一个大小为 192 字节的分配

发生了什么? 是否有可能为堆栈帧分配所有内存?

【问题讨论】:

  • 您的应用程序本身也会消耗内存。查看输出 .EXE 文件的大小。

标签: c++ memory visual-studio-2015 diagnostic-tools


【解决方案1】:

您的应用程序并没有真正漂浮在真空中。当您启动它时,操作系统还会为您的应用程序输出创建一个窗口并启动它,并在某处持有它的句柄。它为堆栈分配了一些内存(确切的数量可能会有所不同,我认为可以自己更改)。

进程本身本质上是一个由内核进程对象表示的容器。它还存储了一些操作它所需的数据。以上所有内容都需要内存,我想这就是您的(几乎是空的)进​​程分配这么多的原因。

此外,如果您制作两个快照,一个在应用程序执行开始时(在执行第一行之前),另一个在执行第一行之后,您会看到堆大小正好增加了大约您分配的内存量,并且大部分内存已在您自己的代码被命中之前分配:

【讨论】:

  • 谢谢,这为我解决了问题。但是为什么 Visual Studio 不只绘制代码和操作系统之间的内存差异呢?
  • @CameronBell,为什么要这样做?它显示了内存分配的来源,应该足以将您自己的分配与操作系统分配区分开来。在图中只留下您自己代码的内存可能会产生误导,因为您仍然不知道您的应用程序总共使用了多少内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2017-09-13
  • 2023-01-11
  • 2017-01-07
相关资源
最近更新 更多