C++中placement new与new表达式用法差异相关疑问
你的猜测正误判断如下:
第一个猜测完全正确
new char[sizeof(string)]属于默认初始化的new表达式,char是内置平凡类型,默认初始化不会执行赋值操作,所以数组内的char值确实是不确定的,你拿到的只是一块大小匹配、对齐符合标准的可用堆内存。第二个猜测基本正确,补充少量细节
placement new的核心作用就是在用户指定的、已经分配完成的内存地址上构造对象,不会额外申请堆空间。这里的char数组元素是平凡类型,不需要显式调用析构就能直接覆盖其内存,所以在buf指向的内存上构造string对象的操作完全合法。关于两种内存分配写法的差异
示例作者选择new char[]而不是直接调用operator new[],核心原因是两种写法在这个场景下效果几乎一致,且new char[]的写法更简洁易读。
C++标准明确规定,针对char、unsigned char、std::byte类型的数组new表达式,分配的内存会自动对齐到满足任意对象的对齐要求,刚好适合用作placement new的前置缓冲区,是这类场景的通用写法。你写的operator new[]版本的实现也是完全正确的,只是写法更繁琐。第四个猜测完全正确
如果是分配不可默认构造的类型T的数组,new T[N]表达式会尝试默认构造N个T类型的对象,自然要求T支持默认构造,否则直接编译失败;而operator new[](sizeof(T)*N)仅分配对应大小的原始内存,不会调用任何构造函数,自然不需要T支持默认构造,不会触发编译错误。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa

