新运营商后跟地址?
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 构造的对象,必须手动调用析构函数。
因此第一个变体分配内存并构造一个对象,而第二个变体仅在先前分配的内存中构造一个对象。
下面的代码在做什么?
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 构造的对象,必须手动调用析构函数。
因此第一个变体分配内存并构造一个对象,而第二个变体仅在先前分配的内存中构造一个对象。