💻 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:

  1. Cada valor em Rust tem um único dono (owner).
  2. Só pode haver um único dono por vez.
  3. 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 trait Copy na 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!