gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:01 24 4
gpt4 key购买 nike

我有一个相当大的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com