visual studio microsoft español descargar community c++ scope static undefined-behavior lifetime

c++ - microsoft - visual studio installer



¿Acceder a un comportamiento estático fuera de alcance no definido? (2)

Mientras hablaban con un colega mío, dijeron que:

foo() { int *p; { int x = 5; p = &x; } int y = *p; }

crea un comportamiento indefinido porque las reglas de vida útil y las reglas de alcance no especifican.

Sin embargo:

foo() { int *p; { static int x = 5; p = &x; } int y = *p; }

¡No está indefinido! Se termina con problemas de "alcance indirecto".

El uso de la terminología no suena correcto.
Sé que la estática no tiene nada que ver con el alcance.
¿Es cierto que el segundo caso tiene comportamiento definido?


Sí, el segundo caso tiene un comportamiento bien definido. Una variable static es básicamente una variable global cuyo nombre está incluido en el ámbito en el que se declara. Se inicializa la primera vez que se introduce el alcance y luego continúa durante toda la vida del programa.

Así que cuando lleguemos

int y = *p;

p apunta a una variable que ya no puede alcanzar (no puede volver a ese código) pero aún tiene una vida útil válida.

Para citar el estándar [basic.stc.static]

Todas las variables que no tienen duración de almacenamiento dinámico, no tienen duración de almacenamiento de subprocesos y no son locales tienen una duración de almacenamiento estático. El almacenamiento de estas entidades durará toda la duración del programa.

énfasis mio

El primer caso no está definido, ya que la vida útil del ámbito local x finaliza en el } y tratar de referirse a él una vez que finaliza su vida útil es un comportamiento indefinido.


citando desde here

La clase de almacenamiento estático le indica al compilador que mantenga una variable local en existencia durante la vida útil del programa en lugar de crearla y destruirla cada vez que entra y sale del alcance. Por lo tanto, hacer que las variables locales sean estáticas les permite mantener sus valores entre las llamadas de función.

así que sí, en el segundo caso x existe durante la vida útil completa del programa.

Por eso ha definido el comportamiento.