Maison >développement back-end >C++ >Qu'arrive-t-il aux pointeurs copiés en C une fois l'original supprimé ?

Qu'arrive-t-il aux pointeurs copiés en C une fois l'original supprimé ?

DDD
DDDoriginal
2024-11-01 15:13:02372parcourir

What Happens to Copied Pointers in C   After the Original is Deleted?

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!

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