Espacios de nombres
Variantes
Acciones

Vida útil

De cppreference.com
< c‎ | language

Cada objeto en C existe, tiene una dirección constante, retiene su último valor almacenado (excepto cuando el valor es indeterminado), y, para VLA, retiene su tamaño (desde C99) sobre una porción de la ejecución del programa conocida como la vida útil de este objeto.

Para los objetos que se declaran con duración de almacenamiento automática, estática y de hilo, la vida útil es igual a su duración de almacenamiento (tenga en cuenta la diferencia entre la duración de almacenamiento automático sin VLA y con VLA).

Para los objetos con duración de almacenamiento asignada, la vida útil comienza cuando la función de asignación devuelve valores (incluida la devolución de realloc) y termina cuando se llama la función de realloc o de anulación de la asignación. Tenga en cuenta que, dado que los objetos asignados no tienen ningún tipo declarado, el tipo de expresión de valor que se utilizó por primera vez para acceder a este objeto se convierte en su tipo efectivo.

Acceder a un objeto fuera de su vida útil es un comportamiento indefinido.

int* foo(void) {
    int a = 17; // (a) tiene una duración de almacenamiento automática
    return &a;
}  // la vida útil de (a) termina
int main(void) {
    int* p = foo(); // p apunta a un objeto con vida util pasada ("dangling pointer" o "referencia colgante")
    int n = *p; // comportamiento indefinido
}

Un puntero a un objeto (o uno más antiguo que el objeto) cuya vida útil terminó tiene un valor indeterminado.

[editar] Vida útil temporal

Los objetos de estructura y unión con miembros de un arreglo (ya sean directos o miembros de estructuras/uniones anidadas) que son designados por expresiones non-lvalue, tienen una vida útil temporal.

La vida útil temporal comienza cuando se evalúa la expresión que se refiere a dicho objeto y termina en el siguiente punto de la secuencia (hasta C11) cuando finaliza la expresión completa o el declarador completo que contiene (desde C11).

Cualquier intento de modificar un objeto con una vida útil temporal tiene como resultado un comportamiento indefinido.

struct T { double a[4]; };
struct T f(void) { return (struct T){3.15}; }
double g1(double* x) { return *x; }
void g2(double* x) { *x = 1.0; }
int main(void)
{
    double d = g1(f().a); // C99: acceso hacia a[0] en g1 produce un comportamiento indefinido debido a 
                          //      que su vida útil terminó en el punto de secuencia al comienzo de g1
                          // C11: esta bien, d es 3.15
    g2(f().a); // C99: comportamiento indefinido al modificar a[0] cuya vida útil ha acabado
               // C11: comportamiento indefinido al intentar modificar un objeto temporal
}



[editar] Referencias

  • Standard C11 (ISO/IEC 9899:2011):
  • 6.2.4 Storage durations of objects (p: 38-39)
  • Standard C99 (ISO/IEC 9899:1999):
  • 6.2.4 Storage durations of objects (p: 32)
  • Standard C89/C90 (ISO/IEC 9899:1990):
  • 3.1.2.4 Storage durations of objects

[editar] Véase también

Documentación de C++ para Vida útil de los objetos