我知道显式调用析构函数可能会由于双重析构函数调用而导致未定义的行为,如下所示:
#include <vector>
int main() {
std::vector<int> foo(10);
foo.~vector<int>();
return 0; // Oops, destructor will be called again on return, double-free.
}
但是,如果我们称placement new 来“复活”对象呢?
#include <vector>
int main() {
std::vector<int> foo(10);
foo.~vector<int>();
new (&foo) std::vector<int>(5);
return 0;
}
更正式地说:
- 如果我明确地在某个对象上显式调用析构函数,而该对象最初不是用放置 new 构造的(例如它要么是局部/全局变量,要么是用
new
) 分配的,然后,在这个对象被破坏之前,在它上面调用placement new 来“恢复”它? - 如果没问题,是否可以保证对该对象的所有非常量引用也可以,只要我在对象“死”时不使用它们?
- 如果是这样,是否可以使用非常量引用之一来放置 new 以复活对象?
- const 引用呢?
示例用例(尽管这个问题更多是关于好奇心):我想“重新分配”一个没有operator=
.
我见过这个问题,它说具有非静态const
成员的“覆盖”对象是非法的。因此,让我们将这个问题的范围限制在没有任何const
成员的对象上。