我有一个相当大的C/C++项目,并且我一直在尝试查找为什么它消耗了过多的内存(由任务管理器中的“工作集”判断)。
我最终将其追溯到奇怪的行为,即使对于最小的malloc()请求,它也会分配一个完整的4k页面。
像这样的代码

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

由于它可以进行1000个4kB分配,因此应该将内存消耗仅增加10KB,最终将其占用4MB。

真正令人沮丧的是,我无法将其复制为独立版本。带有上述代码的小型应用程序可以正常工作。只有大项目表现出错误的行为。
要预先回答一些明显的建议:
  • 我将导入与大项目相同的库,并确保编译标志与
  • 相同
  • "new"的行为与
  • 相同
  • 它同时在调试和 Release模式下发生
  • 我确实将其追溯到罪魁祸首是HeapAlloc。可悲的是,您无法进入HeapAlloc进行进一步调查。

  • 有任何想法吗?我完全陷入了困境。

    最佳答案

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

    听起来好像您的大应用程序中的某处打开了页面堆,或者您在Windows中启用了页面堆的大应用程序中触发了某种应用程序兼容性设置。

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

    关于c++ - Visual Studio 2010 C++ : malloc()/HeapAlloc always allocates new page for even smallest alloc size,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27386994/

    10-10 22:02