初学者可能从来没听说过什么是 placement new。在国内有些地方会翻译为布置new 。而其作用主要是用于原位构造。

通常 new 操作是去向堆空间申请一块区域,而原位构造指的是在给出的指定目标进行构造。
具体的,我们来看下面的代码:
#include <iostream>
struct Node {
int num;
Node(int _num) : num(_num) {
std::printf("[%p] Node() num=%d\n", this, num);
}
~Node() {
std::printf("[%p] ~Node() num=%d\n", this, num);
}
};
int main() {
auto p = new Node(1);
p = new (p) Node(2);
delete p;
}
输出结果为:
[000002530bd01780] Node() num=1
[000002530bd01780] Node() num=2
[000002530bd01780] ~Node() num=2
可见构造函数调用了两次,析构调用了一次,且地址均相同。这就是对原始位置的操作。有了这一特性,能够非常方便的编写内存池以优化空间。