当我们交换它们时,这两者之间有什么区别?它为我编译。
int main()
{
X p;
X* ptr = new (&p) X;
X* ptr = new X (&p);
}
答案 0 :(得分:4)
该行
X* ptr = new (&p) X;
使用展示位置新在X
指向的位置构建&p
类型的新对象。这会在此特定上下文中导致未定义的行为,因为p
已经在其位置上有一个对象(除非X可以轻易地复制和破坏)。然后它返回一个指向该对象的指针,该指针与p
处于同一地址,因此当我们完成p
时,ptr
将指向同一个对象。
该行
X* ptr = new X (&ptr);
在动态分配的位置构造一个类型为X
的新对象,并将&ptr
的值传递给构造函数。仅当X
具有接纳X*
的构造函数时,此方法才有效。然后表达式返回一个指向新对象的指针,该指针不能与&p
相同。
希望这有帮助!