diff --git a/ownership.md b/ownership.md index 4de94874401729759fb3e6acdd6456369ee3554b..d2786ab649828a63d9e27d992d7e8ef31c83f6a7 100644 --- a/ownership.md +++ b/ownership.md @@ -341,6 +341,30 @@ fn main() - Sur une variable on peut avoir: 1. Autant de **références immutables** qu'on veut. 2. Une seule **référence mutable**. +- La référence doit toujours être **valide**. + +## Dangling pointer ("pointeur pendouillant") + +- En désallouant de la mémoire mais en ne détruisant pas le pointeur vers cette mémoire on crée un **dangling pointer**. +- Très dangereux, car on ne sait pas du tout ce qui se pourrait se passer si on essaie de suivre le pointeur pendouillant. +- Tout un tas de langages autorise ce comportement indéfini. +- En Rust cela est **impossible**. +- Exemple : +<pre><code data-trim="hljs rust" class="lang-rust"> +fn dangling() -> &Vec<i32&rt; { // on rend une référence vers un vecteur + let mut v = Vec::new(); + v.push(1); v.push(2); // on a créé un vec avec 1,2 dedans. + + &v; // on retourne une réf vers v +} // v sort de la portée de la fonction et est détruit: + // la mémoire est libérée. + +fn main() { + let dangling_reference = dangling(); +} +</code></pre> + + ## Exemples (1/2)