Considérez l'extrait de code suivant :
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete[] ptr; }
Est-il sécuritaire de supprimer un pointeur alloué en tant que pointeur void* en utilisant le delete[] opérateur ?
Réponse :
La suppression d'un pointeur via un void* n'est explicitement pas définie par la norme C. La section 5.3.5/3 indique :
Dans la première alternative (supprimer l'objet), si le type statique de l'opérande est différent de son type dynamique, le type statique doit être une classe de base du type dynamique de l'opérande. et le type statique doit avoir un destructeur virtuel ou le comportement n'est pas défini. Dans la deuxième alternative (supprimer le tableau), si le type dynamique de l'objet à supprimer diffère de son type statique, le comportement est indéfini.
De plus, la note de bas de page note :
Cela implique qu'un objet ne peut pas être supprimé à l'aide d'un pointeur de type void* car il n'y a pas d'objet de type void.
Conclusion :
Il est dangereux de supprimer un pointeur alloué en tant que void* à l'aide de l'opérateur delete[]. Convertissez toujours le pointeur vers son type d'origine avant de le supprimer.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!