【发布时间】:2014-12-09 19:15:12
【问题描述】:
我有一个相当大的 C/C++ 项目,我一直在试图找出它消耗过多内存的原因(由任务管理器中的“工作集”判断)。 我终于找到了一个奇怪的行为,即使对于最小的 malloc() 请求,它也会分配一个全新的 4k 页面。 像这样的代码
for(int bla = 0; bla < 1000; bla++)
{
char* blu = (char*)malloc(10);
}
这应该会增加 10KB 的内存消耗,但最终会增加 4MB,因为它分配了 1000 个 4kB。
真正令人沮丧的部分是我无法将其复制为独立的。仅使用上述代码的小应用程序就可以正常工作。只有大项目表现出错误的行为。 提前回答一些明显的建议:
我正在拉入与大项目相同的库,并确保编译标志相同
“new”的行为方式相同
在调试和发布模式下都会发生这种情况
我确实追踪到了 HeapAlloc 调用,这是罪魁祸首。遗憾的是,无法进入 HeapAlloc 进行进一步调查。
有什么想法吗?我完全被难住了。
【问题讨论】:
-
仅供参考,无论谁正在阅读此问题及其稍后的答案,这不是问题(这是堆页面问题)。调试堆可以对内存分配进行“填充”以检测缓冲区溢出/不足,但它永远不会像页堆那样将内存分配膨胀 1000 倍。
标签: c++ c visual-studio-2010 memory-management