class FooView final : public Something
{
...
void refresh()
{
this->~FooView();
new (this) FooView();
}
}
Я никогда не видел эту идиому, и кажется, что она может быть очень тонкой и грязной, но я не могу думать о проблеме с ней (пока FooView
она окончательна). Это плохая идея?
c++
placement-new
luqui
источник
источник
Ответы:
Вы можете сделать это, но вам потребуется отмывание памяти для этого, если у вас есть ссылочные или константные члены, или если тип класса изменяется.
Учти это:
Чтобы избежать этого неопределенного поведения, вы должны отмыть память, используя
std::launder
. Компилятор будет предполагать, что время жизниfv
не будет зависеть ни от чего, кроме}
. Отмывание заставит компилятор предположить, что есть объект, не связанный сfv
:Теперь это хорошая идея? Я бы посоветовал против этого, так как это может привести к путанице, но это можно сделать безопасно.
источник