Question

    

Cette question a déjà une réponse ici:

         

S'il vous plaît regardez ce code

int i = 10;                                     //line 1 
int *p = &i;                                    //line 2  
delete p;                                       //line 3 
cout << "*p = " << *p << ", i = " << i << endl; //line 4  
i = 20;                                         //line 5  
cout << "*p = " << *p << ", i = " << i << endl; //line 6  
*p = 30;                                        //line 7
cout << "*p = " << *p << ", i = " << i << endl; //line 8  

Quel est le résultat de ce code? En particulier de la ligne 3, 5 et 7? Ont-ils invoquent un comportement non défini? Quelle serait la sortie?

EDIT: J'ai essayé de l'exécuter en utilisant g ++, et il est la compilation et fonctionne bien! J'utilise MinGW sous Windows 7.

Que dit la norme dans ce contexte?

Était-ce utile?

La solution

Vous pouvez supprimer uniquement un pointeur si vous avez déjà alloué à l'aide dynamique nouvelle. Dans ce cas, vous ne l'avez pas attribué le pointeur à l'aide de nouveau, mais simplement défini et initialisé pour pointer vers une variable locale de type int.

Invoquer supprimer un pointeur non attribué dynamiquement à l'aide nouvelle est quelque chose appelé Undefined Comportement . En bref, cela signifie que quelque chose sur la terre peut se produire lorsqu'un tel code est exécuté et vous ne pouvez pas plainte un peu à tout le monde sur cette planète.

Autres conseils

delete p; est UB et ainsi un comportement plus ne peut pas être prédite ou invoquée. Vous programme peut planter immédiatement ou dépenser tout votre argent ou sortir seulement de main() et rien faire semblant se sont passées.

La ligne 3 est un comportement nettement défini, puisque vous essayez de supprimer la mémoire à une adresse qui ne figure pas sur le tas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top