【问题标题】:C++ heap state differenceC++ 堆状态差异
【发布时间】:2012-08-04 10:30:44
【问题描述】:

有一个用 C++ 编写的大项目。 一些 gui 操作(按钮单击)分配 2 MB 内存。 这不是内存泄漏,当然内存稍后会被释放。 但我需要调查分配了哪些对象以尝试减少内存分配大小。

所以我尝试使用 debug crt

OnBtnClick()
{
    //breakpoint1
    _CrtMemState s1;
    _CrtMemCheckpoint( &s1 );

        //The logic itself

    _CrtMemDumpAllObjectsSince(&s1);
    _CrtMemState s2;
    _CrtMemCheckpoint( &s2 );
    _CrtMemState s3;
    if ( _CrtMemDifference( &s3, &s1, &s2) )
        _CrtMemDumpStatistics( &s3 );
    //breakpoint2
}

调试报告说只分配了 400 KB。 但是任务管理器中两个断点之间的进程内存增加了 2 MB。

因此,创建的转储是无用的。你能解释一下剩余的内存分配在哪里吗?

【问题讨论】:

  • 下划线大写的名称是保留,在你的程序代码中自己编造会使你的程序格式错误。
  • @KerrekSB:除非他们是provided by the implementation;这只会使您的程序不可移植。
  • C 库不向操作系统请求每个对象的内存分配,因此它可能有一些“库存”未使用的内存。
  • @MikeSeymour:谢谢,已修复:-)
  • 您是如何计算分配 2MB 的 gui 操作的?来自任务管理器?

标签: c++ windows heap-memory allocation application-verifier


【解决方案1】:

尝试创建一个重载的全局 New 和 Delete 运算符,将每个请求记录到文件中的简单测试。您可以使用静态全局的状态打开/关闭日志记录。这将为您提供一个工具来记录您可以控制的每个内存分配。

【讨论】:

    【解决方案2】:

    看来我已经找到问题的原因了。

    在按钮单击时,创建了几个 Richedit 窗口控件并填充了数据。 Windows 可能会绕过运行时分配内存。所以我们在 dbgcrt 报告中看不到它的分配。 但是当我关闭richedit句柄时,内存就被成功释放了。

    因此,我将尝试对所有按钮点击使用一个通用的 Richedit。

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多