💻 Exemplos: Capítulo 05: O Sistema de Ownership (Propriedade) e Move Semantics
💻 Exemplos: Capítulo 05: O Sistema de Ownership e Move Semantics
Especialização em Sistemas com Rust • Demonstrações Práticas Compiláveis
🎯 Objetivo dos Exemplos
Demonstrar na prática as 3 regras sagradas do Ownership:
- Cada valor em Rust tem um único dono (owner).
- Só pode haver um único dono por vez.
- Quando o dono sai de escopo, a memória associada na Heap é automaticamente liberada via padrão RAII (Drop).
Também explora Move Semantics, clonagem profunda (
.clone()) e tipos que implementam o traitCopyna Stack.
1. Código Fonte Completo (src/main.rs)
//! Demonstração de Ownership, Transferência de Posse (Move) e RAII em Rust
// Estrutura customizada para observar o momento exato em que a memória é liberada
struct RecursoHardware {
identificador: String,
}
// O trait Drop é o destrutor automático do Rust (RAII)
impl Drop for RecursoHardware {
fn drop(&mut self) {
println!(" [RAII/DROP] O hardware '{}' saiu de escopo e foi liberado da memória!", self.identificador);
}
}
fn processar_mensagem(texto: String) {
println!(" -> Função assumiu o ownership da String: '{}'", texto);
// Ao final desta função, 'texto' sai de escopo e a memória da Heap é liberada!
}
fn duplicar_valor_copy(numero: i32) -> i32 {
numero * 2 // Inteiros implementam 'Copy': são copiados bit a bit na Stack
}
fn main() {
println!("=== AS REGRAS FUNDAMENTAIS DO OWNERSHIP ===");
// 1. Move Semantics com Alocações na Heap (String)
let s1 = String::from("DADOS_CONFIDENCIAIS_SISTEMA");
println!("s1 criada na heap: {}", s1);
// O ownership é transferido de s1 para s2 (MOVE).
// s1 é invalidada em tempo de compilação!
let s2 = s1;
println!("Ownership transferido para s2: {}", s2);
// println!("{}", s1); // ERRO DE COMPILAÇÃO: borrow of moved value: `s1`
// 2. Clonagem Explícita (Deep Copy na Heap)
let s3 = s2.clone(); // Aloca um novo buffer separado na heap
println!("s3 clonada de s2: s2='{}', s3='{}'", s2, s3);
// 3. Transferência de Ownership para Funções
println!("\nPassando String para função por valor (Move):");
processar_mensagem(s3);
// s3 não pode mais ser utilizada aqui pois foi movida para a função!
// println!("{}", s3); // ERRO DE COMPILAÇÃO: value borrowed here after move
// 4. Tipos Escalares da Stack: O Trait Copy
println!("\nComportamento de tipos que implementam 'Copy':");
let valor_original = 42;
let valor_duplicado = duplicar_valor_copy(valor_original);
// 'valor_original' continua 100% válido porque foi copiado na pilha
println!("Original: {}, Duplicado: {}", valor_original, valor_duplicado);
// 5. Escopo e Destruição Determinística com RAII
println!("\nDemonstrando o ciclo de vida e liberação com RAII (Drop):");
{
let _gpu = RecursoHardware { identificador: String::from("NVIDIA_RTX_A6000") };
let _modem = RecursoHardware { identificador: String::from("FIBER_TRANSCEIVER_100G") };
println!(" Recursos de hardware instanciados e operando no bloco...");
// _modem e _gpu serão destruídos automaticamente na ordem inversa de criação!
}
println!("Bloco encerrado. Toda a memória de hardware foi desalocada sem Garbage Collector!");
}
2. Saída Esperada no Terminal
=== AS REGRAS FUNDAMENTAIS DO OWNERSHIP ===
s1 criada na heap: DADOS_CONFIDENCIAIS_SISTEMA
Ownership transferido para s2: DADOS_CONFIDENCIAIS_SISTEMA
s3 clonada de s2: s2='DADOS_CONFIDENCIAIS_SISTEMA', s3='DADOS_CONFIDENCIAIS_SISTEMA'
Passando String para função por valor (Move):
-> Função assumiu o ownership da String: 'DADOS_CONFIDENCIAIS_SISTEMA'
Comportamento de tipos que implementam 'Copy':
Original: 42, Duplicado: 84
Demonstrando o ciclo de vida e liberação com RAII (Drop):
Recursos de hardware instanciados e operando no bloco...
[RAII/DROP] O hardware 'FIBER_TRANSCEIVER_100G' saiu de escopo e foi liberado da memória!
[RAII/DROP] O hardware 'NVIDIA_RTX_A6000' saiu de escopo e foi liberado da memória!
Bloco encerrado. Toda a memória de hardware foi desalocada sem Garbage Collector!