Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面
Visual Studio 2010 C++: malloc()/HeapAlloc always allocates new page for even smallest alloc size
我有一个相当大的C/C++项目,我一直在试图追踪为什么它消耗过多的内存(由任务管理器中的"工作集"判断(。我最终追踪到了一个奇怪的行为,即使是最小的malloc((请求,它也会分配一个全新的4k页面。像这样的代码
for(int bla = 0; bla < 1000; bla++)
{
char* blu = (char*)malloc(10);
}
这应该会增加可怜的 10KB 内存消耗,最终会增加 4MB,因为它会分配 1000 个 4kB。
真正令人沮丧的部分是我无法独立复制它。仅使用上述代码的小应用程序就可以正常工作。只有大项目才会表现出错误的行为。预先回答一些明显的建议:
我正在拉入与大项目相同的库,并确保编译标志相同
"新"的行为方式相同
它发生在调试和发布模式下
我真的追踪到了 HeapAlloc 调用,这是罪魁祸首。可悲的是,人们无法进入HeapAlloc进行进一步调查。
有什么想法吗?我完全被难住了。
Windows包含一个名为"Page Heap"的功能,该功能有助于查找内存损坏缺陷。它通过将每个分配放在页面上来运行,如果程序损坏内存而不是进入未定义的行为区域,则会导致处理器发出访问冲突。
听起来像是在您的大应用程序中的某个地方有人打开了页面堆,或者您在大应用程序中的 Windows 中触发了某种应用程序兼容性设置,该设置启用了页面堆。
请注意,这是一个Windows设置(HeapAlloc是一个Win32 API(,而不是调试/发布编译器设置。
相关文章:
- 变体 - 分配新值时是否清理旧值?
- 分配新的零大小数组可以具有有效价值吗?
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- OpenSSL:当输出ptr为空时,BIGNUM的bin2bn不会分配新的BIGNUM
- 如何在 Linux 中访问新页面时减少延迟
- 每次我分配新的位置时,都会隐式地称为destuructor
- 为什么这个指针到指针的二维数组像这样分配新的 int
- 如何创建对象变量,以便每次分配新的指针
- C 新操作员分配新内存
- 调用时为 std::function 分配新值
- 如果我尚未为指针分配新值,是否需要删除指针?
- OpenCV:为矩阵元素分配新值
- Qt透明QWebView:过去的页面停留在新页面的背景中
- 使用指针调用重载而不分配新内存
- 向指针C++传递和分配新值
- 一个简单的向量,如何正确重新分配新数组的地址
- 在窗口中打开新页面C++
- 使用工厂朋友类分配新类,好习惯
- Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面
- 通过为每个字母分配(新)值在简单加密中使用数组