首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual 2010 C++:malloc()/HeapAlloc总是为最小的分配大小分配新页面

Visual 2010 C++:malloc()/HeapAlloc总是为最小的分配大小分配新页面
EN

Stack Overflow用户
提问于 2014-12-09 19:15:12
回答 1查看 526关注 0票数 4

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

代码语言:javascript
复制
    for(int bla = 0; bla < 1000; bla++)
    {
        char* blu = (char*)malloc(10);
    }

这将使内存消耗增加10 4kB,最终占用它4MB,因为它会分配10004kB。

真正令人沮丧的是,我不能把它复制成独立的。只有上面的代码的一个小应用程序可以正常工作。只有大项目才会表现出错误的行为。直接回答一些明显的建议:

  • 我使用与大型项目相同的库,并确保编译标志是相同的。
  • “新”的行为方式是一样的。
  • 在调试和发布模式下都会发生这种情况。
  • 我真的追踪到了HeapAlloc电话,这是罪魁祸首。可悲的是,我们无法进入HeapAlloc进行进一步的调查。

有什么想法吗?我完全不知所措。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-09 19:18:50

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

听起来像是在您的大应用程序中某个地方有人打开了页面堆,或者您在您的大应用程序中触发了某种类型的Windows应用程序兼容性设置,从而启用了page heap。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27386994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档