在 C++ 中重载 operator new 和 operator new[] 有什么区别?
What's the difference between overloading operator new and operator new[] in C++?
operator new
和operator new[]
具有相同的函数原型:void * (size_t size)
。超载时要注意什么?
如果我只超载 operator new
可以吗?
重载 operator delete
和 operator 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 delete
和operator delete[]
也是如此。
new 创建一个实例,而 new[] 创建一个数组。
new[] 与 new 相比几乎没有内存开销来存储数组的大小。
您不能将非默认构造函数与 new[] 一起使用。
新建必须与删除一起使用。
new[] 必须与 delete[] 一起使用。
另一个区别:
new[] 是一个用于分配和初始化对象数组的运算符,return 是指向第一个元素的指针。
这与 new 运算符不同,后者具有相同的行为,但针对的是一次分配,而不是数组
operator new
和operator new[]
具有相同的函数原型:void * (size_t size)
。超载时要注意什么?
如果我只超载 operator new
可以吗?
重载 operator delete
和 operator 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 delete
和operator delete[]
也是如此。
new 创建一个实例,而 new[] 创建一个数组。
new[] 与 new 相比几乎没有内存开销来存储数组的大小。
您不能将非默认构造函数与 new[] 一起使用。
新建必须与删除一起使用。
new[] 必须与 delete[] 一起使用。
另一个区别:
new[] 是一个用于分配和初始化对象数组的运算符,return 是指向第一个元素的指针。
这与 new 运算符不同,后者具有相同的行为,但针对的是一次分配,而不是数组