Comment faire pour supprimer annuler pointeur?
Il n'y a rien de mal lors de la suppression d'un objet comme ça en C++?
MyCls* c = new MyCls();
void* p = (void*)c;
delete (MyCls*)p;
- Je ne le crois pas.
- Le moulage d'un pointeur vers
void *
et ensuite de retour à son type d'origine est garanti pour préserver sa valeur. - §5.2.9/13 "d'Une valeur de type pointeur sur objet converti en pointeur de cv nul”, et à l'arrière, éventuellement avec différents cv-qualification, doit avoir sa valeur d'origine."
- Pourquoi voudriez-vous faire cela?
- Aidley, parce que je voulais utiliser une classe C++ en C, il était nécessaire d'utiliser void pointeur.
- Je pense que vous devriez probablement poster une question plus détaillée décrivant ce que vous faites et pourquoi, parce que je soupçonne fortement que vous le faites en moins de moyen souhaitable si c'est le cas.
- Toutefois, il ne faut pas dire ce que la valeur résultante est. Il le dit explicitement pour les autres conversions, comme "Une rvalue de type float peut être convertie en une valeur r de type double. La valeur est inchangée"
Vous devez vous connecter pour publier un commentaire.
Ce que l'écrit est légal.
Le casting de retour à
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éfinie. Les deux distributions sont statiques plâtres, même s'il est de bon ton de faire de cette explicites (
static_cast<void*>
, etc.) au lieu d'utiliser le C-style jette. La norme dit que si un pointeur vers l'objet est converti en un pointeur void et à l'arrière par des moulages, il gardera sa valeur d'origine. Ainsi, votre finaldelete
expression a le même effet quedelete c
.Cela étant dit, l'utilisation de
void*
est souvent une odeur de code en C++.void*
. J'ai tant d'histoires de guerre de nettoyage après les anciens programmeurs Java qui attendentdelete someVoidPointer;
à Travailler...Bien que ce code est valide, il n'est pas une bonne pratique.
En règle générale, il ne devrait pas être
new
s etdelete
s dans la nature. Essayez d'appliquer une règle que seuls les constructeurs peuvent appelernew
et seulement destructeurs pouvez appelerdelete
vous aidera à organiser votre code mieux.Si vous êtes à l'aide de C++11, essayez toujours
std::shared_ptr
et autres, cela va faire ci-dessus automatiquement pour vous.