O que o Rust usa em vez de um coletor de lixo para gerenciar memória?
Olá! Acabei de começar a estudar Rust depois de Java e Python, e fiquei com uma dúvida. Em Java e Python existe um coletor de lixo (GC) que libera memória automaticamente quando objetos não são mais necessários. Mas eu li que Rust não tem GC. Como o Rust gerencia a memória sem um coletor de lixo? Será que vou ter que chamar manualmente `free()` ou `delete`, como em C? Isso não é inconveniente e propenso a vazamentos!
Aqui está um exemplo simples que escrevi, tentando entender o que aconteceria:
```rust
fn main() {
let s1 = String::from("Olá");
let s2 = s1; // Eu esperava uma cópia, como em Java
println!("{}", s1); // Isso não compila! Erro: borrow of moved value
}
```
Não entendo por que `s1` não está mais disponível após a atribuição a `s2`. Em Java, `s2` apenas apontaria para a mesma string, e `s1` continuaria válida. O que é "move" e como isso se relaciona com a ausência de GC? E como o Rust garante segurança de memória sem um coletor de lixo? Explique, por favor, para um iniciante.
Também ouvi falar sobre "ownership" (propriedade) e "borrowing" (empréstimo), mas ainda não entendi completamente como eles substituem o GC.