Maison >développement back-end >C++ >Est-il sûr de supprimer la mémoire allouée via `void*` en C ?

Est-il sûr de supprimer la mémoire allouée via `void*` en C ?

DDD
DDDoriginal
2024-12-06 13:55:111047parcourir

Is it Safe to Delete Memory Allocated via `void*` in C  ?

Dangers de la suppression de pointeurs via Void en C

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* ?

Comportement non défini

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

Conséquences

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn