Considérez l'extrait de code suivant :
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete[] ptr; }
La question se pose : est-il sûr à utiliser my_free pour supprimer un pointeur alloué par my_alloc, étant donné que my_alloc renvoie un void* ?
La réponse est un « non » catégorique. La suppression via un void* est explicitement interdite 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.
Et sa note de bas de page ajoute :
Cela implique qu'un l'objet ne peut pas être supprimé à l'aide d'un pointeur de type void* car il n'y a aucun objet de type void
Suppression via un void* peut entraîner des conséquences imprévisibles et catastrophiques. Le programme peut planter avec une erreur de mémoire, corrompre les données ou produire des résultats erronés.
Par conséquent, il est impératif de toujours convertir le pointeur vers le type correct avant de le supprimer. Dans ce cas, le pointeur doit être converti en char* avant de le passer à delete[].
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!