C++ Visual Studio 2010 C++;:malloc()/HeapAlloc始终为最小的alloc大小分配新页面

C++ Visual Studio 2010 C++;:malloc()/HeapAlloc始终为最小的alloc大小分配新页面,c++,c,visual-studio-2010,memory-management,C++,C,Visual Studio 2010,Memory Management,我有一个相当大的C/C++项目,我一直在试图找出它消耗过多内存的原因(根据任务管理器中的“工作集”判断)。 我最终找到了一个奇怪的行为,即使是最小的malloc()请求,它也会分配一个全新的4k页面。 代码是这样的 for(int bla = 0; bla < 1000; bla++) { char* blu = (char*)malloc(10); } for(int-bla=0;bla

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

    for(int bla = 0; bla < 1000; bla++)
    {
        char* blu = (char*)malloc(10);
    }
for(int-bla=0;bla<1000;bla++)
{
char*blu=(char*)malloc(10);
}
这将使内存消耗增加10KB,但最终却增加了4MB,因为它分配了1000个4kB的内存

真正令人沮丧的是,我无法将其复制为独立的。一个只有上面代码的小应用程序可以很好地工作。只有大型项目表现出错误的行为。 要回答一些显而易见的建议:

  • 我使用与大项目相同的库,并且确保编译标志相同

  • “new”的行为方式相同

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

  • 我真的找到了HeapAlloc的电话,那是罪魁祸首。可悲的是,人们无法进入HeapAlloc进行进一步调查


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

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

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


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

哇,非常感谢您的回复!实际上,这最终是一个注册表问题,在这里,我的应用程序被标记为启用了页面堆。删除注册表项后,它现在可以正常工作。仅供参考,稍后阅读此问题及其答案的人,这不是问题(这是堆页问题)。调试堆可以对mem allocs进行“填充”以检测缓冲区的溢出/不足,但它永远不会像页面堆那样将mem分配膨胀1000倍。