2014-09-01 83 views
2

我使用WinDbg通过使用dt _PEB @$peb来查看过程中堆的数量。我现在就根据高级Windows调试书,为什么堆的数量总是1?

大多数应用程序使用隐式创建自己的 堆组件以下信息,

+0x088 NumberOfHeaps : 1 

。一个很好的例子是C运行时,它在初始化期间创建自己的堆 。

我在主要添加断点,我仍然可以看到只有一堆正在处理中。

其次,我跑了下面的代码,仍然堆的数量为1

BYTE* pAlloc1 = NULL; 
BYTE* pAlloc2 = NULL; 
HANDLE hProcessHeap = GetProcessHeap(); 
pAlloc1 = (BYTE*)HeapAlloc(hProcessHeap, 0, 16); 
pAlloc2 = (BYTE*)HeapAlloc(hProcessHeap, 0, 1500); 

为什么我没有收到堆在过程中增加的数量?

+2

您已经从堆中分配了两个分配,但是您尚未创建新的堆。我对Windows几乎一无所知,但大概只有在调用['HeapCreate']时才会得到第二个堆栈(http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa366599(v = vs 0.85)的.aspx)。 – 2014-09-01 13:33:52

+2

一个猜测:通过'HeapAlloc'您可以从进程堆中分配内存,但通过'HeapCreate'您可以创建一个新的私有堆。 – Nazar554 2014-09-01 13:33:53

+0

纯逻辑规定C运行时必须在到达'main'之前创建堆(方式)。 – 2014-09-01 13:43:18

回答

2

当一个进程启动时,它有一个堆,默认进程堆。这就解释了1的数量。你可以通过调用HeapCreate来创建新的堆。如果你这样做,你会看到堆数增加。

+0

但C运行时创建自己的堆? – 2014-09-01 14:19:56

+1

显然没有更多。据推测,这本书提到了一些历史的运行时间。 – 2014-09-01 14:51:14

+1

从VS 2012开始,不是“非常具有历史意义”的C运行时,它使用默认的进程堆。早期版本创建自己的堆。 – 2014-09-01 16:29:03