为什么_get_heap_handle等于GetProcessHeap?

nit*_*ter 1 winapi msvcrt

根据这篇文章,CRT使用单独的堆(它是私有堆吗?),但是这个小例子表明CRT堆默认堆是相同的:

HANDLE heaps[64];
DWORD heapCount = GetProcessHeaps(64, heaps);    
for (int i = 0; i<heapCount; i++)
    printf("heap %d : [0x%x]\n", i, heaps[i]);
printf("crt heap[0x%x], default heap[0x%x]\n", _get_heap_handle(), GetProcessHeap());
Run Code Online (Sandbox Code Playgroud)

在什么情况下GetProcessHeap_get_heap_handle返回不同的句柄?

//使用VS2012编译(平台工具集v110)

Han*_*ant 9

这是VS2012的新功能,CRT现在使用默认进程堆来分配.以前的版本总是创建自己的堆.

使用默认堆的一个显着优点是,与DLL中的代码互操作将更加容易,它可以显着减少必须使用具有自己的CRT链接副本的DLL的麻烦.假设副本当然也是2012+年份.

一个潜在的缺点是,当进程堆损坏时,生成有意义的诊断或干净关闭更加困难,Windows也使用该堆.代码中的内存损坏可能会破坏OS调用的稳定性,这种调用不涉及内核调用,那里可能发生任何事情.我可以想象一下安全风险,我认为一旦他们对安全的CRT增强感到满意就做出了这个选择.

  • 在我所知道的任何地方都没有记录.在微软拥有CRT的人James McNellis告诉我这件事,我通过查看源代码证实了这一点.你也可以.我们在这里创建参考:) (3认同)