malloc
理论上的:
实际中的其他因素:
内存碎片:随着程序的运行,内存不断地被分配和释放,可能会导致堆内存中出现内存碎片的情况。内存碎片就是内存空间被分割成许多不连续的小块,当要malloc分配一个较大的连续内存块时,即使总的空闲内存量足够,但由于这些空闲内存分散在不同位置,无法形成足够大的连续空闲区域,那么malloc也无法成功分配出所需大小的内存。
new
在 C++ 中,new 运算符底层通常也是调用类似malloc的机制来分配内存(在很多标准库实现中是这样的,当然具体实现可能因编译器和标准库而异)。所以其可申请空间的情况在本质上和malloc类似。
不过,new 有一些额外的特性和:
对象构造和初始化:new 不仅要分配内存空间,还要负责调用对象的构造函数对分配的空间进行初始化(对于内置类型,可能是进行默认的初始化,如将整数类型初始化为 0 等)。所以,当申请非常大的内存空间用于创建对象时,如果构造函数本身在执行过程中出现问题(比如构造函数中又有复杂的内存分配或其他可能导致异常的操作),那么即使内存分配阶段(类似malloc的那部分操作)成功了,整个new 操作也可能会抛出异常导致失败。
类型相关:new 是针对具体的类型进行内存分配的,比如new int 是分配用于存储整数的内存空间,new MyClass 是分配用于存储MyClass类型对象的内存空间。不同类型可能有其自身在内存布局和大小方面的特点,这些也会影响到new 可分配的实际大小。例如,有些复杂的自定义类型可能包含大量的成员变量和嵌套的对象,其单个对象所需的内存空间就比较大,那么在给定的系统环境下,能成功用new 分配的该类型对象数量就相对有限。