在 C++ 中重载 operator new 和 operator new[] 有什么区别?

What's the difference between overloading operator new and operator new[] in C++?

operator newoperator new[]具有相同的函数原型:void * (size_t size)。超载时要注意什么?

如果我只超载 operator new 可以吗?

重载 operator deleteoperator delete[] 有什么区别?

operator new用于创建单个对象,如:

my_class* p = new my_class;

operator new[]用于创建对象的数组,如:

my_class* p = new my_class[10];

Is that OK if I only overload operator new?

这取决于您是否需要对数组版本进行特殊处理(operator new[])。默认情况下 operator new[] 会调用 operator new.

基本上,如果您需要重载 operator new,最好也重载 operator new[],因为如果您想实现自己的内存管理,最好让它们保持一致。并且不要忘记 nothrow 和 placement 版本(仅作为成员函数,全局版本不能被替换)。

operator deleteoperator delete[]也是如此。

new 创建一个实例,而 new[] 创建一个数组。

new[] 与 new 相比几乎没有内存开销来存储数组的大小。

您不能将非默认构造函数与 new[] 一起使用。

新建必须与删除一起使用。

new[] 必须与 delete[] 一起使用。

另一个区别:

new[] 是一个用于分配和初始化对象数组的运算符,return 是指向第一个元素的指针。

这与 new 运算符不同,后者具有相同的行为,但针对的是一次分配,而不是数组