41 votes

Comment supprimer le pointeur vide?

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;
 

75voto

StilesCrisis Points 8388

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é.

35voto

Brian Points 15388

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 ++.

-1voto

Earth Engine Points 1795

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.com

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.

Powered by:

X