Y a-t-il un problème lors de la suppression d'un objet comme celui-ci en C ++?
MyCls* c = new MyCls();
void* p = (void*)c;
delete (MyCls*)p;
Y a-t-il un problème lors de la suppression d'un objet comme celui-ci en C ++?
MyCls* c = new MyCls();
void* p = (void*)c;
delete (MyCls*)p;
Ce que l'écrit est légal.
Le casting de retour à l' MyCls*
est critique. Sans cela, vous pourrez invoquer un comportement indéfini--le MyCls destructeur ne sera pas appelé, et d'autres problèmes peuvent survenir en bien (comme un accident). Vous devez jeter en arrière pour le type correct.
Notez également que cela peut être compliqué si l'héritage multiple est impliqué et plusieurs distributions sont utilisés. Vos jette doit "correspondre" dans les deux sens.
Si votre code est structuré de telle sorte que vous ne connaissez pas le type au moment de la destruction, de donner à chaque deletable objet d'une classe de base commune avec un destructeur virtuel. Puis rejetés à la classe de base avant de le supprimer est appelé.
Le code est bien défini. Les deux transtypages sont des transtypages statiques, bien qu'il soit judicieux de rendre cela explicite ( static_cast<void*>
, etc. ) au lieu d'utiliser des transtypages de style C. La norme dit que si un pointeur vers un objet est converti en un pointeur vide et inversé par des transtypages statiques, il conservera sa valeur d'origine. Ainsi, votre expression finale delete
aura le même effet que delete c
.
Cela étant dit, l'utilisation de void*
est souvent une odeur de code en C ++.
Bien que ce code soit valide, ce n'est pas une bonne pratique.
En règle générale, il ne devrait pas y avoir new
s et delete
s dans la nature. Essayez d'appliquer une règle selon laquelle seuls les constructeurs peuvent appeler new
et seuls les destructeurs peuvent appeler delete
vous aideront à mieux organiser votre code.
Si vous utilisez C ++ 11, essayez toujours std::shared_ptr
et similaires, cela fera automatiquement ce qui précède pour vous.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.