La idea básica de administrar recursos (incluida la memoria) en un programa, cualquiera que sea la estrategia, es que los recursos vinculados a "objetos" inalcanzables se pueden recuperar. Más allá de la memoria, esos recursos pueden ser bloqueos mutex, identificadores de archivos, sockets, conexiones de bases de datos ...
Los lenguajes con un recolector de basura escanean periódicamente la memoria (de una forma u otra) para encontrar objetos no utilizados, liberar los recursos asociados con ellos y finalmente liberar la memoria utilizada por esos objetos.
Rust no tiene GC, ¿cómo se las arregla?
El óxido tiene la propiedad. Usando un sistema de tipos afines , rastrea qué variable todavía se aferra a un objeto y, cuando dicha variable sale del alcance, llama a su destructor. Puede ver el sistema de tipos afines en efecto con bastante facilidad:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
Rendimientos:
<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;
^
lo que ilustra perfectamente que en cualquier momento, a nivel del idioma, se realiza un seguimiento de la propiedad.
Esta propiedad funciona de forma recursiva: si tiene una Vec<String>
(es decir, una matriz dinámica de cadenas), entonces cada una String
es propiedad de la Vec
que a su vez es propiedad de una variable u otro objeto, etc. de forma recursiva libera todos los recursos que tenía, incluso indirectamente. En el caso de Vec<String>
esto significa:
- Liberar el búfer de memoria asociado a cada
String
- Liberar el búfer de memoria asociado al
Vec
mismo
Por lo tanto, gracias al seguimiento de la propiedad, la vida útil de TODOS los objetos del programa está estrictamente vinculada a una (o varias) variables de función, que finalmente saldrán del alcance (cuando finalice el bloque al que pertenecen).
Nota: esto es un poco optimista, utilizando el recuento de referencias ( Rc
o Arc
) es posible formar ciclos de referencias y, por lo tanto, causar pérdidas de memoria, en cuyo caso los recursos vinculados al ciclo podrían no liberarse nunca.