我知道显式调用析构函数会因为双析构函数调用而导致未定义的行为,如下所示:
#include <vector>
int main() {
std::vector<int> foo(10);
foo.~vector<int>();
return 0; // Oops, destructor will be called again on return, double-free.
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我们将新位置称为"复活"对象,该怎么办?
#include <vector>
int main() {
std::vector<int> foo(10);
foo.~vector<int>();
new (&foo) std::vector<int>(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更正式的:
new)然后,在该对象被破坏之前,在其上调用placement new以"恢复"它?示例用例(虽然这个问题更多是关于好奇心):我想"重新分配"一个没有的对象operator=.
我已经看到这个问题,说"覆盖"具有非静态const成员的对象是非法的.所以,让我们将这个问题的范围限制在没有任何const成员的对象上.
这是这个问题的后续行动.假设我有这个代码:
class Class {
public virtual method()
{
this->~Class();
new( this ) Class();
}
};
Class* object = new Class();
object->method();
delete object;
Run Code Online (Sandbox Code Playgroud)
这是这个答案所暗示的简化版本.
现在,一旦从method()对象生命周期内调用析构函数结束,并且object调用代码中的指针变量变为无效.然后在同一位置创建新对象.
这是否使指向调用对象的指针再次有效?