La eliminación de un puntero a una variable automática [duplicado]
-
30-09-2019 - |
Pregunta
Esta pregunta ya tiene una respuesta aquí:
Por favor, mire el código
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
¿Cuál es el resultado de este código? Especialmente de la línea 3, 5 y 7? ¿Es que invocan un comportamiento indefinido? ¿Cuál sería el resultado?
EDIT: He intentado ejecutarlo usando g ++, y de compilar y ejecutar bien! Estoy usando MinGW en Windows 7.
¿Qué dice estándar en este contexto?
Solución
Puede eliminar sólo un puntero si alguna vez ha asignado dinámicamente usando nueva. En este caso no se ha asignado el puntero utilizando las nuevas sino simplemente definido e inicializado para que apunte a una variable local de tipo int.
Invocación de eliminación en un puntero no asigna dinámicamente utilizando nueva es algo que se llama comportamiento indefinido . En pocas palabras, esto significa que nada en la tierra puede ocurrir cuando se ejecuta un código de este tipo y no se puede queja un poco para cualquier persona en este planeta.
Otros consejos
delete p;
es UB y por lo que cualquier comportamiento más no se puede predecir o depender de ella. Usted programa puede bloquearse inmediatamente o pasar todo su dinero o salir sólo de main()
y nada de simulación sucedieron.
La línea 3 es sin duda un comportamiento indefinido, ya que usted está tratando de borrar la memoria en una dirección que no está en el montón.