为什么进程的“私有字节”内存计数器永远不会返回到其原始值?

2023-12-19

如果我有一个本机 C++ 程序并查看它的初始“私有字节”内存计数器,为什么在创建并删除对象后它不会返回到其原始值?

例如,如果我有一个有两个按钮的应用程序(32位,Native C++ MFC)。 其中一个在循环中分配一个对象的 1,000,000 个实例,然后另一个按钮则删除这些相同的对象。

如果我查看进程的专用字节计数器,我会得到以下 3 个值:
.
描述......................私有字节数
===================================
应用程序已启动......................1,608K
对象。已创建........33,176K
对象。已删除......................2,520K

912K(2520-1608)泄漏?

假设我的代码没有泄漏内存,我相信这不是为什么私有字节计数不会返回到EXACT初始值?

如果我再次单击这两个按钮(没有重新启动程序)(第一个按钮创建了另外 1,000,000 个对象),第二个按钮删除了它们,我会得到以下结果:

对象。已创建........33,472K
对象。已删除......................2,552K

新泄漏 (2552-2520) = 32K

我只是在寻找关于为什么内存不会恢复到原始值的解释。

示例代码(删除了一些生成的代码以减少噪音):

class Person
{
public:
   Person(void);
   ~Person(void);

   Person* Next;
   int A;
   int B;
   int C;
   int D;

};


class Cdelme_MFC2005_MemoryTestDlg : public CDialog
{
// some code stripped out here to simplify reading.

   Person* m_PeopleList_First;
   Person* m_PeopleList_Last;

public:
   afx_msg void OnBnClickedButtonAllocate();
   afx_msg void OnBnClickedButtonFree();
};


Cdelme_MFC2005_MemoryTestDlg::Cdelme_MFC2005_MemoryTestDlg(CWnd* pParent /*=NULL*/)
    : CDialog(Cdelme_MFC2005_MemoryTestDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

   m_PeopleList_First = NULL;
   m_PeopleList_Last = NULL;

}


void Cdelme_MFC2005_MemoryTestDlg::OnBnClickedButtonAllocate()
{
   if ( m_PeopleList_First == NULL )
   {
      m_PeopleList_First = new  Person();
      m_PeopleList_First->A = 0;
      m_PeopleList_Last = m_PeopleList_First;
   }

   int MAX = 1000000;
   for (int i = 0; i <MAX ; i++)
   {
      Person* p = new Person();
      p->A = i;
      m_PeopleList_Last->Next = p;
      m_PeopleList_Last = p;
   }
}

void Cdelme_MFC2005_MemoryTestDlg::OnBnClickedButtonFree()
{
   Person* p = m_PeopleList_First;
   while ( p != NULL )
   {
      Person* pNext = p->Next;
      delete p;
      p = pNext;
   }
   m_PeopleList_First = NULL;
   m_PeopleList_Last = NULL;
}

你这里有几个问题。首先,当你delete内存,标准库通常这样做not将内存释放回操作系统。它通常保留该内存的所有权,但将其标记为可用于其他分配。由于您显然使用的是 MS VC++,因此您可以使用_heapwalk在你做了你的之后delete查看仍在进程堆中的空闲块。如果您确实愿意,也可以致电_heapmin将(至少大部分)可用内存释放回操作系统。早在那时(MS VC++ 4.0,如果没记错的话),MS 有一个直接使用操作系统内存管理的标准库版本,但性能很差(说得好听一点),所以这种情况并没有持续很长时间。

其次,MFC 在后台进行了相当多的操作,它分配各种“东西”以使事情正常工作,但之后不会立即释放它们(并且由于其中大部分或多或少是不可见的,因此没有简单/直接的方法供您释放它)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么进程的“私有字节”内存计数器永远不会返回到其原始值? 的相关文章

  • 将 Stream 反序列化为 List 或任何其他类型

    尝试将流反序列化为List
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • 是否允许将类模板类型参数键入相同的名称?

    这似乎可以在 MSVC 中按预期编译甚至工作 但它是合法的 C 代码吗 它是否能保证执行此处所期望的操作 即将模板类型导出到结构体的同名用户 template
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 为什么这个函数指针赋值在直接赋值时有效,但在使用条件运算符时无效?

    本示例未使用 include 在 MacOS10 14 Eclipse IDE 上编译 使用 g 选项 O0 g3 Wall c fmessage length 0 假设这个变量声明 int fun int 这无法通过 std touppe
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • 设计 Javascript 前端 <-> C++ 后端通信

    在我最近的将来 我将不得不制作一个具有 C 后端和 Web 前端的系统 要求 目前 我对此了解不多 我认为前端将触发数据传输 而不是后端 所以不需要类似 Comet 的东西 由于在该领域的经验可能很少 我非常感谢您对我所做的设计决策的评论
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task

随机推荐

  • SIP 408:在 zoiper 中创建帐户时请求超时

    我已经下载了zoiper220 linux tar gz并解压缩它 但是当我尝试在其中创建帐户时 它显示 SIP 408 请求超时错误 我已经尝试这个好几天了 提前致谢 您必须首先使用 sip conf 中设置的用户名和密码在软电话中注册
  • Reshaper 默认格式和规则列表

    我正在尝试查找 Resharper 强制执行的所有默认格式和规则的列表 不幸的是 我没有任何运气 我们使用该工具 但希望向新员工提供标准文档 以便他们可以在编码之前查看标准 在 ReSharper 菜单下的 选项 下 您将找到 ReShar
  • 如何在绘制多个热图时修复 plt.tight_layout() 错误

    我正在将多个热图绘制在一起 并且不希望它们用轴标签挤满空间 我尝试使用 plt tight layout 但它向我抛出了一些错误 这是我没有 plt tight layout 的结果 没有 plt tight layout 的热图 http
  • 我在实施传单抽奖时做错了什么。在这个具体示例中如何使用 WFST?

    我是地理信息开发领域的新手 我按照下面的管道架构流程来实现基于 GIS 的应用程序问题 PostGIS GeoServer 传单 我已经设置了传单客户端应用程序 它将图块组成地图 我还使用一些传单插件 如绘图 缩放 以便用户可以选择在地图上
  • 一个函数可以检测 NaN、NA、Inf、-Inf 等?

    R 中是否有一个函数可以确定某个值是否为NA NaN Inf Inf 或者不是一个格式良好的数字 你要is finite gt is finite NA 1 FALSE gt is finite NaN 1 FALSE gt is fini
  • {@inheritDoc} 不继承 Eclipse 中的超类 javadoc

    当我使用 inheritDoc 在 Eclipse 中 超类的 javadoc 注释没有出现在我的类的 javadoc 中 我有以下代码 import javax swing table AbstractTableModel public
  • 如何使用 MVC 4 显示数据库中的二进制图像以编辑表单

    我成功地将图像作为二进制图像存储在数据库中 我想在编辑表单中显示这些图像以修改并保存更改 显示数据库中的二进制图像时 以 Edit cshtml 形式抛出 System OutOfMemoryException 有人可以纠正我的代码吗 型号
  • Google App Engine 防火墙和内部访问

    我有两项服务在 Google App Engine flex 同一项目 上运行 我希望一项服务使用 HTTPS 调用另一项服务 最重要的是 我设置了防火墙 只允许0 1 0 40 and 10 0 0 1 我也在设置X Appengine
  • mclapply 与 for 循环绘图:速度和可扩展性焦点

    我正在 R 中运行一个函数 该函数可能需要很长时间才能运行 因为它在将某些数据推入之前执行多个命令来转换和子集一些数据ggplot来策划 我需要多次运行此函数来调整参数值 我将提供的示例是一个简单的示例 但想知道如何加快速度 如果扩大规模
  • C++/CLI .NET 可以使用资源 .resx 文件进行本地化吗?

    我正在尝试将托管 C NET DLL 本地化为多种语言 这些表单非常简单 因为它们的操作就像其他语言一样并创建多个 resx 文件 除了以传统 C 方式使用 RC 字符串表之外 我找不到任何在托管 C 中本地化嵌入字符串的示例 有没有什么方
  • 我可以为任何没有 UDID 的设备分发我的应用程序吗?

    我一直在搜索 stackoverflow 阅读各种博客来获取我的问题的答案 我可以将我的应用程序分发给某人 而不获取他的设备 UDID 吗 我找到的答案都是 不 你必须有 UDID 列表 但是 有人 私营公司 告诉我 他们过去常常在不向开发
  • 64 位模运算的奇怪性能行为

    这些方法调用中的最后三个大约需要花费大约时间 比前四个时间多了一倍 唯一的区别是它们的参数不再适合整数 但这有关系吗 该参数被声明为long 因此无论如何都应该使用long进行计算 模运算是否使用另一种数字 gt maxint 算法 我使用
  • 有没有办法让 Activity 知道刚刚创建了什么片段?

    An Activity可能会膨胀任意布局 xml 该布局可能有也可能没有Fragment其中的占位符 如果是的话 Fragment将被实例化并附加到Activity 有什么办法可以参考一下Fragment来自Activity那已经附加了吗
  • JSF 2 默认日期时间转换器模式

    我的 JSF 页面以以下格式显示托管 bean 的日期时间 MM dd yyyy h mm a 我想避免在不同页面中重复声明转换器
  • protobuf-net 是否支持 C# 9 位置记录类型?

    我正在尝试将 protobuf net 与 C 位置记录类型一起使用 并且遇到了此异常 10 18 48 048 EROR 010 Microsoft AspNetCore Server Kestrel Connection id 0HM4
  • 无法在 itunes connect 中更改捆绑包 ID?

    我的第一个应用程序被拒绝 因为它的捆绑包 ID 中有 Youtube 一词 从那时起 我更改了 plist info 中的包 ID 和 Xcode 中的包标识符 我还在 Apple 开发者网站的会员中心的标识符部分下创建了一个新的应用程序
  • 以下划线开头的名称显示错误 gh-pages 分支的页面不存在

    我对 github 的 gh pages 有疑问 以 下划线 开头的 html 页面显示错误 Page does not exist Read the Full Documentation Instructions for setting
  • 构建大型 KML 文件

    我生成的 KML 文件可能有 50 000 个或更多地标 根据特定于域的分组排列在文件夹中 KML 文件使用打包到 KMZ 文件中的自定义图像 我希望将单个 KML 文件分解为多个文件 并根据分组进行分区 因此我不会拥有 1 个带有文件夹的
  • 使用匿名结构与使用 typedef 的命名结构

    什么时候应该使用以下语句之一而不是另一个 typedef struct Foo int a Bar and typedef struct int a Bar 并像这样使用它 Bar bar1 5 我知道第二个是一个匿名结构 但不确定何时应该
  • 为什么进程的“私有字节”内存计数器永远不会返回到其原始值?

    如果我有一个本机 C 程序并查看它的初始 私有字节 内存计数器 为什么在创建并删除对象后它不会返回到其原始值 例如 如果我有一个有两个按钮的应用程序 32位 Native C MFC 其中一个在循环中分配一个对象的 1 000 000 个实