class FooView final : public Something
{
...
void refresh()
{
this->~FooView();
new (this) FooView();
}
}
Nigdy nie widziałem tego idiomu i wydaje się, że może być bardzo subtelny i nieuporządkowany, ale tak naprawdę nie mogę wymyślić z nim problemu (dopóki FooView
jest ostateczny). Czy to zły pomysł?
c++
placement-new
luqui
źródło
źródło
Odpowiedzi:
Możesz to zrobić, ale będziesz potrzebował do tego prania pamięci, jeśli masz odwołania lub stałe elementy, lub jeśli typ klasy się zmieni.
Rozważ to:
Aby uniknąć tego niezdefiniowanego zachowania, należy prać pamięć za pomocą
std::launder
. Kompilator przyjmie, że na życiefv
nie wpłynie nic oprócz}
. Pranie powoduje, że kompilator przyjmuje, że istnieje obiekt niezwiązany zfv
:Czy to dobry pomysł? Odradzałbym to, ponieważ może to prowadzić do zamieszania, ale można to zrobić bezpiecznie.
źródło