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
Libérer: 2024-12-05 04:35:10
original
496 Les gens l'ont consulté

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

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

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 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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal