Avatar ·

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.