L'idée de base de la gestion des ressources (y compris la mémoire) dans un programme, quelle que soit la stratégie, est que les ressources liées à des «objets» inaccessibles peuvent être récupérées. Au-delà de la mémoire, ces ressources peuvent être des verrous mutex, des descripteurs de fichiers, des sockets, des connexions de base de données ...
Les langages dotés d'un ramasse-miettes analysent périodiquement la mémoire (d'une manière ou d'une autre) pour trouver des objets inutilisés, libèrent les ressources qui leur sont associées et enfin libèrent la mémoire utilisée par ces objets.
Rust n'a pas de GC, comment gère-t-il?
Rust est propriétaire. En utilisant un système de type affine , il suit quelle variable tient toujours un objet et, lorsqu'une telle variable sort de la portée, appelle son destructeur. Vous pouvez voir le système de type affine en vigueur assez facilement:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
Rendements:
<anon>:4:24: 4:25 error: use of moved value: `s` [E0382]
<anon>:4 println!("{}", s);
<anon>:3:13: 3:14 note: `s` moved here because it has type `collections::string::String`, which is moved by default
<anon>:3 let t = s;
^
ce qui illustre parfaitement qu'à tout moment, au niveau de la langue, la propriété est suivie.
Cette propriété fonctionne de manière récursive: si vous avez un Vec<String>
(c'est-à-dire un tableau dynamique de chaînes), alors chacun String
est détenu par le Vec
qui lui-même appartient à une variable ou à un autre objet, etc ... ainsi, lorsqu'une variable sort de la portée, il libère récursivement toutes les ressources qu'il détenait, même indirectement. Dans le cas du, Vec<String>
cela signifie:
- Libération de la mémoire tampon associée à chaque
String
- Libération du tampon mémoire associé à
Vec
lui - même
Ainsi, grâce au suivi de propriété, la durée de vie de TOUS les objets du programme est strictement liée à une (ou plusieurs) variables de fonction, qui finiront par sortir du champ d'application (lorsque le bloc auquel ils appartiennent se termine).
Remarque: c'est un peu optimiste, en utilisant le comptage de références ( Rc
ou Arc
) il est possible de former des cycles de références et donc de provoquer des fuites de mémoire, auquel cas les ressources liées au cycle pourraient ne jamais être libérées.