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

标签 c++ c visual-studio-2010 memory-management

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

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

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

真正令人沮丧的部分是我无法将其作为独立文件重现。仅包含上述代码的小型应用程序就可以正常工作。只有大项目才会表现出错误的行为。 直接回答一些明显的建议:

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

  • "new"的行为方式相同

  • 在 Debug 和 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/

相关文章:

c - "warning: division by zero [-Wdiv-by-zero]"当不除以零时

c# - 如何连接到 SDF 数据库?我尝试的连接字符串似乎没有用

c++ - 将位图图像加载到 WINApi C++ 中并显示

c# - 如何从pdf中获取pantone色号?

c - 为什么c接受int变量中的字符串

c - 我无法让这段代码正常运行。显示 1 到 100 之间的质数

c++ - win32 控件 : different coordinates in resource. rc 和 CreateWindow?

c++ - CUDA 6.5 : error MSB3191 Unable to create directory and LNK2001 Unresolved External symbol

c++ - Qt OpenGL 纹理为黑色

c++ - SO_RCVTIME和SO_RCVTIMEO不影响Boost.Asio操作