Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面

Visual Studio 2010 C++: malloc()/HeapAlloc always allocates new page for even smallest alloc size

本文关键字:分配 新页面 HeapAlloc C++ 2010 Studio malloc Visual      更新时间:2023-10-16

我有一个相当大的C/C++项目,我一直在试图追踪为什么它消耗过多的内存(由任务管理器中的"工作集"判断(。我最终追踪到了一个奇怪的行为,即使是最小的malloc((请求,它也会分配一个全新的4k页面。像这样的代码

    for(int bla = 0; bla < 1000; bla++)
    {
        char* blu = (char*)malloc(10);
    }

这应该会增加可怜的 10KB 内存消耗,最终会增加 4MB,因为它会分配 1000 个 4kB。

真正令人沮丧的部分是我无法独立复制它。仅使用上述代码的小应用程序就可以正常工作。只有大项目才会表现出错误的行为。预先回答一些明显的建议:

  • 我正在拉入与大项目相同的库,并确保编译标志相同

  • "新"的行为方式相同

  • 它发生在调试和发布模式下

  • 我真的追踪到了 HeapAlloc 调用,这是罪魁祸首。可悲的是,人们无法进入HeapAlloc进行进一步调查。

有什么想法吗?我完全被难住了。

Windows包含一个名为"Page Heap"的功能,该功能有助于查找内存损坏缺陷。它通过将每个分配放在页面上来运行,如果程序损坏内存而不是进入未定义的行为区域,则会导致处理器发出访问冲突。

听起来像是在您的大应用程序中的某个地方有人打开了页面堆,或者您在大应用程序中的 Windows 中触发了某种应用程序兼容性设置,该设置启用了页面堆。

请注意,这是一个Windows设置(HeapAlloc是一个Win32 API(,而不是调试/发布编译器设置。