Maison  >  Article  >  développement back-end  >  L'utilisation d'un pointeur dérivé d'un pointeur supprimé est-elle valide en C ?

L'utilisation d'un pointeur dérivé d'un pointeur supprimé est-elle valide en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 06:30:30441parcourir

Is using a pointer derived from a deleted pointer valid in C  ?

Pointeurs après suppression en C : le cas perplexe de a et b

Dans le monde des pointeurs C, l'acte de supprimer un élément alloué la mémoire via la suppression soulève des questions sur la validité des pointeurs pointant vers cette mémoire. Considérons le scénario suivant :

<code class="cpp">A* a = new A();
A* b = a;

delete a;

A* c = a; // illegal in C++11
A* d = b; // legal?</code>

Le nœud de la question réside dans la détermination de la validité de l'utilisation de la valeur du pointeur b après la suppression de a.

Le sort de Pointeurs invalides : comportement non défini en C 11, implémentation définie en C 14

En C 11, accès la valeur d'un pointeur supprimé (a) entraîne un comportement indéfini. Cependant, l'utilisation d'un pointeur (b) dérivé du pointeur supprimé présente une situation nuancée.

Sous C 11, les deux c = a ; et d = b; sont considérés comme un comportement indéfini. En effet, a et b sont considérés comme des « valeurs de pointeur invalides » car ils pointent vers un stockage désalloué. Toute tentative d'effectuer des opérations sur des pointeurs invalides est explicitement indéfinie.

Intricacities définies par l'implémentation dans C 14

C 14 introduit des changements subtils à ce scénario. Selon la norme révisée, « utiliser une valeur de pointeur non valide » inclut « copier la valeur de ». Par conséquent, en C 14, les deux affectations à c et d sont considérées comme définies par l'implémentation.

La raison derrière ce changement est que la copie d'une valeur de pointeur non valide pourrait potentiellement déclencher une erreur d'exécution sur certaines implémentations. La norme laisse judicieusement à l'implémentation le soin de gérer de tels cas comme elle l'entend.

En conclusion, la légalité de l'utilisation de b après la suppression de a dépend de la version C utilisée. C 11 considère les deux c = a ; et d = b; comportement indéfini, tandis que C 14 transfère la responsabilité vers la mise en œuvre, laissant le résultat non spécifié dans la norme.

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