class FooView final : public Something
{
...
void refresh()
{
this->~FooView();
new (this) FooView();
}
}
Je n'ai jamais vu cet idiome, et il semble que cela pourrait être vraiment subtil et désordonné, mais je ne peux pas vraiment penser à un problème avec lui (tant que FooView
est définitif). Est-ce une mauvaise idée?
c++
placement-new
luqui
la source
la source
Réponses:
Vous pouvez le faire, mais vous aurez besoin de blanchiment de mémoire pour cela si vous avez des membres de référence ou const, ou si le type de la classe change.
Considère ceci:
Pour éviter ce comportement indéfini, vous devez blanchir la mémoire à l'aide de
std::launder
. Le compilateur supposera que la durée de vie defv
ne sera affectée par rien sauf}
. Le blanchiment obligera le compilateur à supposer qu'il existe un objet, sans rapport avecfv
:Est-ce maintenant une bonne idée? Je le déconseille car cela peut prêter à confusion, mais cela peut être fait en toute sécurité.
la source