Pointeurs en C après suppression
Considérez l'extrait de code suivant en C :
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // Undefined behavior in C++11 A* d = b; // Potentially legal, but uncertain</code>
Ce code lève le question : que se passe-t-il lors de l'accès à la valeur d'un pointeur copié après la suppression du pointeur d'origine ?
En C 11, accéder à la valeur d'un pointeur qui a été supprimé entraîne un comportement indéfini. Cela s'applique aux deux pointeurs a et b. Copier la valeur de a dans c n'est pas non plus défini, car a indique une mémoire désallouée.
Cependant, en C 14, le comportement devient défini par l'implémentation. La norme précise que :
"L'indirection via une valeur de pointeur non valide et le passage d'une valeur de pointeur non valide à une fonction de désallocation ont un comportement non défini. Toute autre utilisation d'une valeur de pointeur non valide a un comportement défini par l'implémentation."
Par conséquent, en C 14, l'accès à la valeur de b, qui est une copie de a, est également défini par l'implémentation. Cela pourrait potentiellement conduire à un comportement indéfini, mais cela peut également être géré différemment par des implémentations spécifiques.
En résumé, A* c = a; et A* d = b; ne sont pas définis en C 11 et définis par l'implémentation en C 14. En effet, les deux pointeurs a et b pointent vers une mémoire invalide après l'opération de suppression.
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!