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
Libérer: 2024-12-06 13:55:11
original
1039 Les gens l'ont consulté

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal