假设我有10 kB的堆,并像这样混合使用C和C ++代码。
char* block1 = malloc(5*1024); //allocate 5
char* block2 = new[](4*1024); // allocate 4
Run Code Online (Sandbox Code Playgroud)
是否存在C堆和C ++堆,或者仅存在一个通用的堆?这样“新”知道堆的前5 kb已经分配了吗?
可能有也可能没有单独的C和C ++堆。您不能编写一个能够说明差异的合格C ++程序,因此这完全取决于实现。
该标准描述了默认行为的第一步,operator new如下所示:
执行一个循环:在循环中,该函数首先尝试分配请求的存储。尝试是否涉及对C标准库函数malloc或aligned_alloc的调用均未指定。[new.delete.single] /4.1。
而对于malloc本身的标准说:“[ ,aligned_alloc,calloc,malloc和realloc]不要试图通过调用来分配存储空间::operator new()” [c.malloc / 3。
因此,意图是,它可以调用malloc从operator new,但它不是必需的。
在实践中,operator new打电话malloc。