Namespaces
Variants

Lifetime

From cppreference.net

Tout objet en C existe, possède une adresse constante, conserve sa dernière valeur stockée (sauf lorsque la valeur est indéterminée) , et, pour les VLA, conserve sa taille (depuis C99) pendant une partie de l'exécution du programme connue comme la durée de vie de cet objet.

Pour les objets déclarés avec une durée de stockage automatique, statique et thread, la durée de vie équivaut à leur durée de stockage (notez la différence entre la durée de stockage automatique non-VLA et VLA).

Pour les objets ayant une durée de stockage allouée, la durée de vie commence lorsque la fonction d'allocation retourne (y compris le retour de realloc ) et se termine lorsque la fonction realloc ou de désallocation est appelée. Notez que puisque les objets alloués n'ont pas de type déclaré , le type de l'expression lvalue utilisée en premier pour accéder à cet objet devient son type effectif .

Accéder à un objet en dehors de sa durée de vie est un comportement indéfini.

int* foo(void) {
    int a = 17; // a a une durée de stockage automatique
    return &a;
}  // durée de vie de a se termine
int main(void) {
    int* p = foo(); // p pointe vers un objet après sa durée de vie ("pointeur pendouillant")
    int n = *p; // comportement indéfini
}

Un pointeur vers un objet (ou un au-delà de l'objet) dont la durée de vie s'est terminée a une valeur indéterminée.

Durée de vie temporaire

Les objets struct et union avec des membres de tableau (soit directs, soit membres de struct/union imbriquées) qui sont désignés par des expressions non-lvalue , ont une durée de vie temporaire . La durée de vie temporaire commence lorsque l'expression qui fait référence à cet objet est évaluée et se termine au prochain point de séquence (jusqu'en C11) lorsque l'expression complète ou le déclarateur complet contenant se termine (depuis C11) .

Toute tentative de modifier un objet à durée de vie temporaire entraîne un comportement indéfini.

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 : Comportement indéfini accès à a[0] dans g1 dont la durée de vie s'est terminée
                          //       au point de séquence au début de g1
                          // C11 : OK, d vaut 3.15
    g2(f().a); // C99 : Comportement indéfini modification de a[0] dont la durée de vie s'est terminée au point de séquence
               // C11 : Comportement indéfini tentative de modification d'un objet temporaire
}

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.2.4 Durées de stockage des objets (p: 30)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 6.2.4 Durées de stockage des objets (p: 38-39)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 6.2.4 Durées de stockage des objets (p: 32)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 3.1.2.4 Durées de stockage des objets

Voir aussi

Documentation C++ pour Durée de vie des objets