为名为new
和new[]
的{{1}}和operator new
分别设置重载的原因是什么?因为它们都只用于分配一定数量的内存 - 为什么我要为每个内存编写不同的代码?
答案 0 :(得分:1)
new
用于创建单个对象
int * foo = new int; // now I have one int*
new[]
用于创建多个对象并将它们放入连续的内存(数组)
int * bar = new int[someIntegerValue];
使用新内容时,您需要确保将其与正确的delete
电话匹配。如果您使用new
,则需要对delete
进行相应的调用,同样适用于new[]
和delete[]
int * foo = new int; // now I have one int*
//more code...
// now that I'm done with foo
delete foo;
int * bar = new int[someIntegerValue];
//more code...
// now that I'm done with bar.
delete [] bar;
答案 1 :(得分:0)
内存分配优化,因为您不需要按照注释中的建议存储数组大小不原因(实际上,每个18.6.1.2的operator new[]
的默认行为是调用operator new
来分配存储空间
此外,无论如何,都会为每个实际实现中的每个分配存储分配大小(从中可以简单地推导出数组大小)。
您需要两个版本的new
的决定性原因是,通常需要数组版本(原因很明显),但数组版本不能有初始化程序。然而,在单个新表达式上具有初始化器是非常期望的。因此,需要两个单独的版本。
此外,一些优化的分配器(例如freelist)对于单个对象很容易实现,但对于连续的数组非常困难。具有10个元素的freelist不一定具有10个连续元素(甚至两个连续的元素!),因此没有简单的方法可以可靠地为数组分配工作。<登记/>
这意味着没有两个单独版本的new
,您根本无法实现这样的事情。有两个版本,你仍然可以使用一个自定义分配器,但不能用于另一个。
作为免费提供的“奖励”,您可以单独覆盖(和=delete
)两个运营商,如果由于某种原因,您希望处理它们显着不同或有选择地不希望允许他们中的一个。