首先,在内存的容量足够,而空闲的内存的分布却不连续的情况下 new 操作是会失败的。
空间不足肯定导致分配失败。至于所有碎片的合集是否大于所需空间不在 new 的考虑范围内。空间不足是需要程序员自己处理的。这个概念总是被隐含式地提到。一个比较典型的例子就是 EC++ 中,对 new 操作实现和对 new-handler 函数功能的要求。该文中对 new 操作的详细描述见后。
Zark(金陵五月)说的有道理,在new char4G次,然后释放2G偶数char,如果再new char[2]会失败。但是有一个问题:
new 函数应该不是那么死心眼,就会申请连续内存。我觉得new应该满足一定大小的范围内,他是new出连续的地址,如果new得大小超过一定的大小范围,那么new出来的地址应该是不连续的。并且会有一个类似于叶面管理之类的机制,把这些颗粒给连起来。