Я знаю, что вызов деструктора явно может привести к поведению undefined из-за двойного вызова деструктора, как здесь:
#include <vector>
int main() {
std::vector<int> foo(10);
foo.~vector<int>();
return 0; // Oops, destructor will be called again on return, double-free.
}
Но что, если мы будем называть новое слово "воскрешать" объект?
#include <vector>
int main() {
std::vector<int> foo(10);
foo.~vector<int>();
new (&foo) std::vector<int>(5);
return 0;
}
Более формально:
- Что произойдет в С++ (меня интересуют как С++ 03, так и С++ 11, если есть разница), если я явно вызываю деструктор на каком-то объекте, который не был создан с использованием размещения new в первом (например, это либо локальная/глобальная переменная, либо выделена с помощью
new
), а затем, прежде чем этот объект будет разрушен, вызовите новое место на нем, чтобы "восстановить" его? - Если все в порядке, то гарантируется, что все неконстантные ссылки на этот объект также будут в порядке, если я не использую их, пока объект "мертв"?
- Если да, можно ли использовать одну из неконстантных ссылок для размещения new, чтобы воскресить объект?
- Что относительно ссылок на const?
Пример usecase (хотя этот вопрос больше связан с любопытством): Я хочу "повторно назначить" объект, который не имеет operator=
.
Я видел этот вопрос, в котором говорится, что объект "переопределения", который имеет нестатические члены const
, является незаконным. Итак, позвольте ограничить область действия этого вопроса объектами, которые не имеют каких-либо членов const
.