【发布时间】:2021-08-22 23:19:06
【问题描述】:
再次与展示位置new 我在这个论坛上找到了一个这样的例子:
char *buf = new char[sizeof(string)]; // pre-allocated buffer
string *p = new (buf) string("hi"); // placement new
string *q = new string("hi"); // ordinary heap allocation
-
但我认为这里
buf是一个指向已分配和构造的默认初始化字符动态数组的指针。所以数组中的字符都是默认初始化的,并且有一个不确定的值。 -
我猜想使用第二行中的
new位置会在之前构造的对象数组上构造对象。 -
为什么用户没有在数组分配上调用
operator new而不是使用new表达式?:char *buf = static_cast<char*>(operator new[](sizeof(string))); -
毕竟我认为如果
buff是一个指向非默认可构造对象的动态数组的指针,那么代码将无法使用 new 表达式而不是使用 operator new 函数进行编译。 -
我的猜测正确吗?
这是原始答案的链接:
【问题讨论】:
-
@TedLyngmo:因为我认为 new 表达式完成了三个任务:分配、构造,最后返回一个指向新分配和构造的内存的指针。不是吗?
-
典型运算符 new:
void * operator new(size_t size) { void * p = malloc(size); return p; }是的,这是默认初始化,也就是“无操作”。 New 表达式调用 operator new 作为其一部分,但它还提供您提供的构造函数调用或初始化,假设默认构造函数或默认初始化。使用动态内存,后者等于 noop。 -
@TedLyngmo "
new char[sizeof(string)]分配一个数组,最有可能 4 或 8 个字节长" -sizeof(string)远远超过 4/8 个字节,尤其是如果它实现 SSO -
@RemyLebeau 你很可能是正确的。我走了。该标准允许
sizeof(string)为任何字节大小。并不是说它必须超过 4 或 8。通常是。编辑:(这不是 - 真的)我不能把自己从这个坟墓里挖出来。我完全错了。我确实知道string的样子,但我的大脑冻结了。 -
@TedLyngmo:您似乎误解了new operator vs operator new 之间的细微差别。此外,
new char[sizeof(string)]确实默认初始化。只是char的默认初始化是noop。您可能正在考虑“值初始化”,它没有这样做。
标签: c++ new-operator placement-new new-expression