为什么有两个版本的operator new重载?

时间:2015-04-02 12:30:24

标签: c++ new-operator c++14 iso

为名为newnew[]的{​​{1}}和operator new分别设置重载的原因是什么?因为它们都只用于分配一定数量的内存 - 为什么我要为每个内存编写不同的代码?

2 个答案:

答案 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)两个运营商,如果由于某种原因,您希望处理它们显着不同或有选择地不希望允许他们中的一个。