新运营商后跟地址?

New operator followed by address?

下面的代码在做什么?

int a;
int *b;
b = new (&a) int(5);

是否等同于:

int a;
int *b;
a = 5;
b = new int(a);

?

b = new (&a) int(5); 表示 new 将在给定地址 &a 构造您的对象(此处为 b == &a

所以不,它不等同于 b = new int(a)(这里是 b != &a

它们等同。第二个分配内存并在该内存中构造给定类型的对象,然后 returns 该内存的地址。在您的示例中,该地址存储在 b.

第一个变体称为 placement new 并假设存储已经分配到参数指向的地址(&a 在您的情况下)并将然后在该地址构造给定类型的对象。它将 return &a。此外,要销毁由 placement new 构造的对象,必须手动调用析构函数。

因此第一个变体分配内存并构造一个对象,而第二个变体仅在先前分配的内存中构造一个对象。

详情请看这里:https://en.cppreference.com/w/cpp/language/new