我有一个简单的类,其中包含一个指向它自己的成员之一的指针:
struct X {
int val;
int* pVal;
X(int v) : val(v), pVal(&val) {}
}
X x(1);
我有一些这样的代码:
void foo() {
doStuffWith(x);
x = X(2); // completely discard the old value of X, and start again
doStuffWith(x);
}
我担心当 x 被重新分配时,如果没有发生返回值优化,x.pVal
将无效地指向临时成员。X(2)
我意识到我可以编写一个复制构造函数来解决这个问题。然而,一开始就进行复制似乎很浪费,而不是在一开始就在内存中的正确位置构建对象。
在这里使用placement new 操作符是否合理?或者这会对析构函数产生意想不到的后果?
void foo() {
doStuffWith(x);
new (&x) X(2); // completely discard the old value of X, and start again
doStuffWith(x);
}