HeapALloc分配失败?MSDN解释和new的实现矛盾?该如何解决

HeapALloc分配失败?MSDN解释和new的实现矛盾? - C++ Builder / Windows SDK/API
下面两段话是不是矛盾?

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这两个是编译器的实现,其它的是操作系统的事。