::operator new[]()与::operator new()有什么不同?
In what way is ::operator new[]() different than ::operator new()?
我需要从先前分配的内存块中构造一个对象数组。然而,在分配该块时,从用户的角度来看,我无法理解::operator new[]()
与::operator new()
的不同之处,因为两者都需要块的大小。在下面的示例中,使用其中任何一个似乎都有相同的效果。我错过什么了吗?
class J {
};
int main() {
const int size = 5;
{
J* a = static_cast<J*> (::operator new[](sizeof (J) * size));
for (int i = 0; i < size; i++)
new (&a[i]) J();
for (int i = 0; i < size; i++)
a[i].~J();
::operator delete[] (a);
}
{
J* a = static_cast<J*> (::operator new(sizeof (J) * size));
for (int i = 0; i < size; i++)
new (&a[i]) J();
for (int i = 0; i < size; i++)
a[i].~J();
::operator delete (a);
}
}
你在滥用new
。
使用new []
的要点在于它为分配的数组的每个元素调用构造函数。delete[]
对析构函数做同样的操作。
您正在使用位置new
并手动调用构造函数和析构函数,错过了整个要点。
它们都是分配函数,因此它们都被要求返回适合请求大小的存储空间(这里是sizeof(J) * size
)。这就是为什么它们在你的代码中没有什么不同。
它们的不同之处在于operator new
是在非数组new表达式中查找的分配函数(例如new J
),而operator new[]
是在数组new表达式中查找的分配函数(例如new J[1]
)。如果程序为数组分配内存的策略不同于为单个对象分配内存的策略,则允许自定义。如果不需要这样的定制,那么operator new[]
可以直接委托给operator new
(这实际上是实现提供的分配函数所强制要求的,即::operator new
和::operator new[]
)。所以这个差别与你的代码无关
相关文章:
- 过载'operator new'如何导致无限循环?
- 在C++中调用 malloc() 与"operator new"函数之间的实现差异
- C++和组装:通过ASM呼叫'operator new'和'operator delete'
- 'operator new':函数不接受 2 个参数
- 错误 C2661:'CObject::operator new':没有重载函数需要 4 个参数
- 错误 35 错误 C2661:'operator new':没有重载函数占用 2 个参数
- 什么是"::operator new"和"::operator delete"?
- void* in malloc vs operator new
- 我们还需要"placement new"和"operator new"吗?
- 'operator new'的第一个形式参数必须'size_t'
- 正在对使用operator new okay的放置delete操作的结果调用delete
- operator new[]在MSVC调试时非常慢
- ::operator new[]()与::operator new()有什么不同?
- 为什么替换malloc()需要了解链接器,而::operator new()不需要
- 带nothrow选项的Operator new仍然会抛出异常
- :operator delete(void*)是否知道使用::operator new(size_t)分配的内存大小
- 类x没有默认构造函数,operator new继承
- 如何使用operator new对包含复合类的派生类进行直接初始化
- 如何使用operator new创建动态2D字符数组
- 执行operator new的任何实现都返回指向大小为零的数组的保护页的指针