En C/C++ et dans d'autres langages bas niveau, le développeur doit gérer explicitement l'emplacement des données en mémoire : dans la pile (variables automatiques) ou dans le tas (allocation via malloc/new). Dans ces langages, il y a souvent des erreurs d'utilisation de la mémoire, comme des fuites de mémoire, des doubles libérations, ou l'utilisation de mémoire non initialisée ou déjà libérée. Rust prend en charge un contrôle strict de la mémoire grâce à un système de propriété, sans utiliser de ramasse-miettes.
La gestion automatique de la mémoire via la pile est pratique, mais limitée par la taille (profondeur de la pile). L'allocation dans le tas nécessite une gestion explicite des ressources, ce qui est dangereux : on peut oublier de libérer la mémoire ou violer les zones de vie des pointeurs. Le ramasse-miettes n'est pas toujours une solution (coût des ressources, pauses imprévisibles). Les erreurs de gestion de la mémoire entraînent des pannes et des vulnérabilités.
En Rust, la pile et le tas se distinguent par la gestion automatique : toutes les valeurs sont par défaut placées sur la pile, tandis que pour les objets de taille dynamique ou à longue durée de vie, le tas est utilisé via des pointeurs intelligents (par exemple, Box<T>, Vec<T>). Le système de propriété et de références garantit qu'après le transfert de propriété ou la fin de la zone de vie, les ressources seront libérées automatiquement. Tout cela garantit une sécurité assurée au moment de la compilation et l'absence de pauses inutiles dues à un ramasse-miettes.
Exemple de code :
fn main() { let a = 42; // allocation sur la pile let b = Box::new(42); // allocation sur le tas let mut v = Vec::new(); v.push(1); v.push(2); // données de tableau dans le tas }
Caractéristiques clés :
Box<T> utilisent le tas, mais se libèrent par RAII.Peut-on libérer manuellement (drop) la mémoire sur la pile ?
Non. La libération des variables allouées sur la pile se fait automatiquement à la sortie de la portée, faire drop manuellement est inutile et même inacceptable pour les pointeurs sur la pile.
Un transfert (move) entraîne-t-il un transfert vers le tas ?
Non. Le déplacement d'une variable entre propriétaires ne déplace pas forcément celle-ci dans le tas, il ne fait que changer la propriété.
Utiliser Box<T> garantit-il que T est toujours dans le tas ?
Oui, Box<T> alloue effectivement T dans le tas, cependant la propriété et la zone de vie sont toujours strictement contrôlées.
Box<T>.Le projet utilise des vecteurs globaux (Vec<T>) avec une implémentation manuelle du nettoyage via mem::forget ou drop, laissant parfois des pointeurs suspendus sur de la mémoire libérée.
Avantages :
Inconvénients :
Les objets sont explicitement alloués via Box, les données sont transférées selon les règles de propriété, pour les collections, on utilise des pointeurs intelligents et on ne retourne pas de références aux variables de la pile.
Avantages :
Inconvénients :