class FooView final : public Something
{
...
void refresh()
{
this->~FooView();
new (this) FooView();
}
}
Ich habe diese Redewendung noch nie gesehen, und es scheint, als könnte sie wirklich subtil und chaotisch sein, aber ich kann mir kein Problem damit vorstellen (solange FooView
es endgültig ist). Ist das eine schlechte Idee?
c++
placement-new
luqui
quelle
quelle
Antworten:
Sie können dies tun, benötigen dafür jedoch Speicherwäsche, wenn Sie Referenz- oder Konstantenelemente haben oder wenn sich der Typ der Klasse ändert.
Bedenken Sie:
Um dieses undefinierte Verhalten zu vermeiden, sollten Sie den Speicher mit waschen
std::launder
. Der Compiler geht davon aus, dass die Lebensdauer vonfv
durch nichts anderes beeinflusst wird}
. Beim Waschen nimmt der Compiler an, dass es ein Objekt gibt, das nichts mit Folgendem zu tun hatfv
:Ist es jetzt eine gute Idee? Ich würde davon abraten, da dies zu Verwirrung führen kann, aber sicher durchgeführt werden kann.
quelle