新操作连续分配的内存是?

iBa*_*hus 3 c++

正如标题所说,我想在c ++中知道,一个新操作分配的内存是否是连续的......

min*_*ang 17

BYTE* data = new BYTE[size];
Run Code Online (Sandbox Code Playgroud)

在此代码中,无论给出什么大小,返回的内存区域都是连续的.如果堆管理器无法分配连续的内存size,则失败.malloc将返回异常(或NULL ).

程序员总会在进程的地址空间中看到连续(和是,无限:-)内存的错觉.这就是虚拟内存为程序员提供的功能.

请注意,程序员(除少数嵌入式系统之外)总是看到虚拟内存.但是,可以以任意方式在物理存储器中映射实际连续的存储器(以"页面"大小的粒度,通常为4KB).那个映射,你看不到,而且大多数你不需要理解它(除了非常具体的页面级优化).

那这个呢?

BYTE* data1 = new BYTE[size1];
BYTE* data2 = new BYTE[size2];
Run Code Online (Sandbox Code Playgroud)

当然,你不能说的相对地址data1data2.这通常是不确定的.它取决于请求发生时的堆管理器(例如malloc,通常new只是包装malloc)策略和当前堆状态.

  • 哇那里.如果`new`失败,它会抛出`std :: bad_alloc`.它**从不**返回NULL. (8认同)
  • @rlbond - 永远不要说永远.除了较旧的编译器(VC6仍然被广泛使用),`new`的`std :: nothrow`重载可以为失败返回0.只是提出一个愚蠢的琐事. (2认同)

Jam*_*lis 7

进程的地址空间中分配的内存将是连续的.

这些字节如何映射到物理内存是特定于实现的; 如果你分配了一个非常大的内存块,它很可能被映射到物理内存的不同部分.

编辑: 由于有人不同意保证字节是连续的,标准说(3.7.3.1):

分配功能尝试分配所请求的存储量.如果成功,它将返回存储块的起始地址,其长度以字节为单位应至少与请求的大小一样大.

  • 这是错误的 - 您无法保证订购进出您的流程. (2认同)