Une référence ne doit jamais survivre à sa donnée.A reference must never outlive its data.
Le Vol 1 s'est clos sur une question laissée ouverte : une slice pointe à l'intérieur d'une donnée qu'elle ne possède pas — que se passe-t-il si le propriétaire la libère pendant que la vue regarde encore ? Dans un langage à pointeurs nus, c'est le use-after-free : un pointeur qui désigne de la mémoire déjà rendue. La cause numéro un de failles mémoire. Rust en fait une erreur de compilation. Voici comment il s'y prend.Vol 1 closed on a question left open: a slice points inside data it doesn't own — what happens if the owner frees it while the view is still looking? In a raw-pointer language, that's use-after-free: a pointer designating already-returned memory. The number-one cause of memory vulnerabilities. Rust turns it into a compile error. Here's how.
let r; // une référence... { let x = 5; // x naît ici r = &x; // r emprunte x } // x meurt ICI — sa mémoire est libérée println!("{r}"); // ✕ r désignerait de la mémoire morte // error[E0597]: `x` does not live long enough
Le compilateur attribue à chaque valeur une durée de vie — un intervalle entre sa naissance et sa libération. La règle est unique : une référence ne peut être utilisée que pendant l'intervalle où sa donnée est vivante. Ici, r prétend vivre plus longtemps que x — la barre dépasse. Refusé.The compiler assigns every value a lifetime — an interval between its birth and its release. The rule is single: a reference may only be used while its data is alive. Here, r claims to live longer than x — the bar overruns. Refused.
« Cette référence, de quelle donnée tient-elle sa vie, et cette donnée vit-elle assez longtemps ? » Les lifetimes ne sont pas une syntaxe à mémoriser : ce sont les durées que le compilateur suivait déjà, rendues parfois explicites quand il ne peut plus les déduire seul.'This reference — which data does it draw its life from, and does that data live long enough?' Lifetimes aren't a syntax to memorize: they're the durations the compiler already tracked, made explicit only when it can no longer infer them alone.
Tu as déjà rencontré les lifetimes au Vol 1 sans les nommer : le borrow checker qui refusait un emprunt « qui traîne », c'était déjà une question de durée. Ce volume ne fait que donner un nom — et une notation, 'a — à ce que le compilateur calculait en silence. La syntaxe vient en dernier, et seulement quand elle est nécessaire.You already met lifetimes in Vol 1 without naming them: the borrow checker refusing a borrow that 'lingered' was already a question of duration. This volume only gives a name — and a notation, 'a — to what the compiler computed silently. The syntax comes last, and only when it's needed.