winapi - 为什么_get_heap_handle 等于GetProcessHeap?

标签 winapi msvcrt

根据这个article , CRT 使用单独的堆(是私有(private)堆吗?),但是这个小例子表明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());

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

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

最佳答案

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

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

一个潜在的缺点是当进程堆损坏时更难生成有意义的诊断或干净地关闭,Windows 也使用该堆。代码中的内存损坏会破坏操作系统调用的稳定性,这种调用不涉及内核调用,在那里一切皆有可能。我也能想象到安全风险,我假设他们是在对安全的 CRT 增强感到满意后才做出这个选择的。

关于winapi - 为什么_get_heap_handle 等于GetProcessHeap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18955871/

相关文章:

c++ - 如何检测窗口已经最大化?

python - 如何使用 Windows 中的 RSA 私钥 BLOB 正确解密 python 中的数据

linux - 为什么CRT要与内核分离?

c++ - 如何确定哪个 Windows DLL 正在用于函数调用?

windows - 文件句柄上的 WaitForSingleObject?

c++ - 如何将仿函数分配给函数指针?

c++ - 使用 WinAPI 进行夏令时和 UTC 到本地时间的转换

c - 为什么 windows api 滚动条没有响应?

visual-studio - 为什么我需要安装 MSVC++ redist。?

c - 寻求对 Visual Studio C 运行时库链接行为的更深入了解