至少在Windows下有多少堆软件

Gui*_*e07 4 c++ memory

我发现C-runtime有自己的堆(以及windows HeapWalk下的所有Heap API).关于我以前的知识,我似乎有点麻烦,看起来这个过程实际上是几个堆而不仅仅是一个.这样对吗 ?如果是这样的话,为什么需要几个堆呢?

Han*_*ant 7

Windows进程通常至少有3个堆:

  • 默认进程堆.GlobalAlloc()从中分配,主要由Windows使用
  • COM堆.CoTaskMemAlloc()和SysAllocString()从中分配,由任何COM服务器使用
  • CRT堆.新的运算符和malloc()函数从中分配.

拥有多个CRT堆的情况并不少见,使用/ MT构建的任何DLL都有自己的CRT副本,从而获得自己的堆.我没想到只从一个堆中分配的确切原因对我来说是模糊的.

GetProcessHeaps()函数可用于迭代进程中的所有堆.


更新:黑暗的部分有点不受影响.从VS2012开始,CRT现在从默认进程堆中分配第一个项目符号.请记住,这不会追溯性地更改未重建的旧DLL上的行为.