我知道 C++ 中 free 和 delete 之间的区别。但是我从未理解的一件事是为什么在 C malloc/free 中可以分配取消分配单个“对象”和数组,但在 C++ 中我们需要使用正确的 new/delete vs new[]/delete[] 对。
在 Stackoverflow 上搜索,似乎在 C++ 中, new[] 分配额外的内存来保存分配数组的大小,而 new 仅将内存分配给对象本身。正因为如此,您应该意识到这种额外的开销。
如果上一段确实如此,那么 malloc/free 是如何处理这个开销的呢?或者他们只是接受这种开销?如果在 C 中可以容忍,为什么不能在 C++ 中?
另一方面,如果不是因为内存开销,而是因为调用构造函数和析构函数,编译器不能足够聪明以在引擎盖下生成适当的代码并让程序员只为两个单独的对象编写 new/delete对象和对象数组?
我正在为一种语义类似于 C++ 的玩具语言编写编译器,似乎可以让编译器决定如何仅使用 new/delete 来分配和取消分配,但由于 C++ 使用 new/delete 和 new[ ]/delete[],也许有一个我现在没有看到的问题。也许与多态性和虚拟表有关?
如果你很好奇,我的天真的想法是简单地分配一个整数和对象/数组,其中这个整数是数组的大小或简单的 1 如果是对象。然后,在调用 delete 时,它检查整数的值,如果是 1,则调用析构函数。如果它大于 1,则它迭代数组调用析构函数到数组中的每个对象。正如我所说,它似乎有效,并且会让程序员只编写 new/delete 而不是 new/delete vs new[]/delete。但话又说回来,也许有一个我没有看到的问题。
编辑部分:
经过一些答案,我决定尝试提供一些伪代码和更好的背景。
在 C 语言中,通常使用 malloc() 进行内存分配,使用 free() 进行取消分配。无论是分配单个 POD、单个结构还是数组,malloc() 都适合所有这些情况。如果您正在分配一个数组,则无需使用不同版本的 malloc(),如果您分配的是单个 struct 与 malloc_array() 版本。至少在公共 API 级别。换句话说,分配几个字节或多个字节似乎都没有关系,记录分配大小信息不会产生任何开销。
很多人都知道,包括我自己,new 和 delete 不仅仅是分配和取消分配内存。New 分配内存并调用构造函数,delete …
c++ arrays compiler-construction memory-management dynamic-memory-allocation