我有一个相当大的C/C++项目,我一直在试图跟踪它为什么消耗过多的内存(根据任务管理器中的“工作集”判断)。我最终找到了奇怪的行为,即使是最小的malloc()请求,它也会分配一个完整的4k页面。这样的代码
for(int bla = 0; bla < 1000; bla++)
{
char* blu = (char*)malloc(10);
}这将使内存消耗增加10 4kB,最终占用它4MB,因为它会分配10004kB。
真正令人沮丧的是,我不能把它复制成独立的。只有上面的代码的一个小应用程序可以正常工作。只有大项目才会表现出错误的行为。直接回答一些明显的建议:
有什么想法吗?我完全不知所措。
发布于 2014-12-09 19:18:50
Windows包含一个名为"页堆“的特性,它有助于查找内存损坏的缺陷。它通过将每个分配放在一个页面上进行操作,如果程序破坏了内存而不是输入未定义的行为区域,这将导致处理器发出访问冲突。
听起来像是在您的大应用程序中某个地方有人打开了页面堆,或者您在您的大应用程序中触发了某种类型的Windows应用程序兼容性设置,从而启用了page heap。
请注意,这是Windows设置(HeapAlloc是Win32 API),而不是调试/发布编译器设置。
https://stackoverflow.com/questions/27386994
复制相似问题