HeapALloc分配失败?MSDN解释和new的实现矛盾?
下面两段话是不是矛盾?
1、MSDN上的解释为:HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连续的空间能满足分配的大小,程序不能将其他零散的空间利用起来,从而导致分配失败)
2、调用关系如下 new->malloc->HeapAlloc->VirtualAlloc->驱动程序的_PageAlloc。
上面的调用关系是一般的WIN32编译器的调用顺序。
其中HeapAlloc已经实现了malloc的那些小块内存管理,以Heap开头的有一系列函数,你会发现它与malloc/free等可以对应起来。
按照new的实现,heapalloc不会因为找不到连续的空间而分配失败
而按照MSDN的解释,heapalloc不能将其他零散的空间利用起来,导致分配失败。
VirtualAlloc分配虚拟内存,new每次都是先从分配磁盘开始,然后再提交到物理内存这样?
[解决办法]
HeapAlloc是逻辑上不能离散,_PageAlloc是物理上不能离散,
VirtualAlloc把离散的物理存储变成连续的逻辑存储。
new->malloc这两个是编译器的实现,其它的是操作系统的事。