AnyCompiler

Ownership

Todo valor em Rust tem exatamente um dono (owner) por vez. Quando o dono sai do seu escopo (scope), o valor é descartado (drop) e sua memória é liberada automaticamente — sem coletor de lixo, sem free() manual. Essa única regra é o que permite ao Rust garantir a segurança de memória inteiramente em tempo de compilação.

Copy types vs. moves

Tipos simples como i32 implementam o trait Copy, então atribuir uma variável a outra apenas copia o valor — ambas continuam usáveis de forma independente.

fn main() {
    let x = 5;
    let y = x; // i32 is Copy, so x is still valid
    println!("x = {}, y = {}", x, y);
}
Output
x = 5, y = 5

Um String não implementa Copy, porque é dono de dados alocados no heap. Atribuir s1 a s2 move o ownership — s1 não é mais válido depois disso, o que evita que ambas as variáveis tentem liberar a mesma memória mais tarde.

fn main() {
    let s1 = String::from("hello");
    let s2 = s1; // s1 is moved into s2

    println!("{}", s2);
}
Output
hello

Como é um erro de move real

Isto é genuinamente o que o rustc reporta quando você tenta usar um valor depois que ele foi movido — capturado de uma execução real, não escrito para parecer plausível:

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;

    println!("{}, world!", s1);
}
Output
error[E0382]: borrow of moved value: `s1`
 --> main.rs:5:28
  |
2 |     let s1 = String::from("hello");
  |         -- move occurs because `s1` has type `std::string::String`, which does not implement the `Copy` trait
3 |     let s2 = s1;
  |              -- value moved here
4 | 
5 |     println!("{}, world!", s1);
  |                            ^^ value borrowed here after move

error: aborting due to previous error

For more information about this error, try `rustc --explain E0382`.

Nada roda de fato — nenhum resultado, só o erro. Esse é todo o ponto: o Rust detecta um possível use-after-free em tempo de compilação, em uma linguagem sem coletor de lixo para limpar a bagunça se isso tivesse passado despercebido.

Próximo: referências e borrowing — como usar um valor sem tomar seu ownership.

Practice Exercise

Crie um String name = String::from("Alice"). Mova-o para uma nova variável owner, depois imprima owner (não name).