1

S'il vous plaît regarder ce codeSuppression d'un pointeur vers une variable automatique

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? Surtout de la ligne 3, 5 et 7? Est-ce qu'ils invoquent un comportement indéfini? Quel serait le résultat?

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

Que dit Standard dans ce contexte?

+0

avez-vous essayé de l'exécuter? peut être vous pouvez ajouter le résultat de votre course et nous pouvons en discuter alors? – Nim

+0

Pourquoi ne pas compiler et voir? Je reçois un segfault ... – Kricket

+0

'*** erreur pour l'objet 0x7fff5fbff5ec: pointeur en cours de libération n'a pas été affecté *** définir un point d'arrêt dans malloc_error_break à déboguer» lors de l'exécution ... compilé avec g ++ 4.1 dans MacOS X. Par ma définition de «courir» ne fonctionne pas bien. –

Répondre

5

Vous pouvez supprimer uniquement un pointeur si vous l'avez déjà alloué dynamiquement en utilisant new. Dans ce cas, vous n'avez pas alloué le pointeur en utilisant new mais simplement défini et initialisé pour pointer vers une variable locale de type int.

L'appel d'une suppression sur un pointeur non alloué dynamiquement à l'aide de new est appelé Undefined Behavior. En bref, cela signifie que tout ce qui se passe sur la Terre peut se produire lorsqu'un tel code est exécuté et que vous ne pouvez pas vous plaindre à qui que ce soit sur cette planète.

+1

Non seulement la mémoire doit être allouée dynamiquement, mais elle doit être allouée avec 'new' uniquement. – sharptooth

+0

@sharptooth: oui, mis à jour – Chubsdad

1

delete p; est UB et donc tout autre comportement ne peut être prédit ou invoqué. Votre programme peut se bloquer immédiatement ou dépenser tout votre argent ou simplement quitter le et prétendre que rien ne s'est passé.

0

La ligne 3 est définitivement un comportement indéfini, puisque vous essayez de supprimer de la mémoire à une adresse qui n'est pas sur le tas.

+2

pourquoi est-ce que cela a été downvoted, puisqu'il dit la même chose que celle qui a été upvoted? –