【发布时间】:2021-11-08 12:00:39
【问题描述】:
我试图理解 C++ 中的placement new-expressions。
This Stack Overflow answer 声明T* p = new T(arg); 等价于
void* place = operator new(sizeof(T)); // storage allocation
T* p = new(place) T(arg); // object construction
而delete p; 等价于
p->~T(); // object destruction
operator delete(p); // storage deallocation
为什么我们需要T* p = new(place) T(arg); 中的placement new-expression 来构造对象,下面的不是等价的吗?
T* p = (T*) place;
*p = T(arg);
【问题讨论】:
-
*p = T(arg);是赋值,而不是构造。但是你不能对从未构造过的东西调用赋值。 -
@Evg 你是对的,构造了一个临时对象,并在其上调用了移动构造函数。但是问题是什么,你不能从临时对象移动到具有动态存储时长的对象吗?
-
没有要移动的对象!它尚未建成。
-
除了placement new,没有办法在预定的内存位置创建对象。
-
@Maggyero “并在其上调用移动构造函数。” - 不,如果你写
*p = T(arg),调用的是move assignment operator,而不是move constructor。在未初始化的内存上调用赋值运算符是未定义的行为。
标签: c++ dynamic-memory-allocation placement-new object-construction