A ideia básica de gerenciar recursos (incluindo memória) em um programa, seja qual for a estratégia, é que os recursos vinculados a "objetos" inacessíveis podem ser recuperados. Além da memória, esses recursos podem ser bloqueios mutex, identificadores de arquivo, sockets, conexões de banco de dados ...
As linguagens com um coletor de lixo varrem periodicamente a memória (de uma forma ou de outra) para localizar objetos não usados, liberar os recursos associados a eles e, finalmente, liberar a memória usada por esses objetos.
Rust não tem GC, como funciona?
A ferrugem tem propriedade. Usando um sistema de tipo afim , ele rastreia qual variável ainda está segurando um objeto e, quando tal variável sai do escopo, chama seu destruidor. Você pode ver o sistema de tipo afim em vigor com bastante facilidade:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
Rendimentos:
<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;
^
o que ilustra perfeitamente que em qualquer momento, no nível da linguagem, a propriedade é rastreada.
Esta propriedade funciona de forma recursiva: se você tem um Vec<String>
(ou seja, uma matriz dinâmica de cordas), então cada um String
é de propriedade do Vec
que em si é propriedade de uma variável ou um outro objeto, etc ... Assim, quando uma variável sai do escopo, ele libera recursivamente todos os recursos que mantinha, mesmo indiretamente. No caso de Vec<String>
isso significa:
- Liberando o buffer de memória associado a cada
String
- Liberando o buffer de memória associado ao
Vec
próprio
Assim, graças ao rastreamento de propriedade, o tempo de vida de TODOS os objetos do programa está estritamente ligado a uma (ou várias) variáveis de função, que acabarão por sair do escopo (quando o bloco ao qual eles pertencem terminar).
Nota: isso é um pouco otimista, usando a contagem de referências ( Rc
ou Arc
) é possível formar ciclos de referências e assim causar vazamentos de memória, caso em que os recursos vinculados ao ciclo podem nunca ser liberados.