Maison >développement back-end >C++ >Puis-je supprimer des objets en toute sécurité via un pointeur vide en C ?

Puis-je supprimer des objets en toute sécurité via un pointeur vide en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-05 04:35:10424parcourir

Can I Safely Delete Objects Through a Void Pointer in C  ?

Pointeurs vides et suppression d'objets

En C, les pointeurs vides peuvent être utilisés pour stocker des adresses d'objets de tout type. Une question courante se pose : pouvons-nous supprimer des objets en toute sécurité via un pointeur vide ?

Le problème :

Considérez le code suivant :

void* my_alloc(size_t size) {
  return new char[size];
}

void my_free(void* ptr) {
  delete [] ptr;
}

Ici, my_alloc alloue un tableau de caractères et renvoie un pointeur vide. my_free tente de supprimer l'objet pointé par le pointeur vide.

La réponse :

Supprimer un objet via un pointeur vide sans lancer est un comportement indéfini selon le C Norme (5.3.5/3). Cela signifie que le comportement peut varier selon les compilateurs et les plates-formes.

La raison de ce comportement non défini est que le compilateur ne peut pas déterminer le type réel de l'objet à supprimer. Par conséquent, il est impossible de garantir que le bon destructeur sera appelé, ce qui pourrait entraîner une corruption de la mémoire ou d'autres comportements inattendus.

Approche sûre :

Pour supprimer en toute sécurité objets via un pointeur vide, il doit être converti en type de pointeur d'origine qui a alloué l'objet. Cela garantit que le bon destructeur est appelé et que toutes les ressources associées à l'objet sont correctement nettoyées.

Par exemple, dans le code ci-dessus, la suppression doit être effectuée comme suit :

char* ptr = (char*)my_alloc(size);
delete [] ptr;

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