Executando verificação de segurança...
4

Como funciona o conceito de ownership em Rust?

O conceito de ownership em Rust é uma das principais características que garantem segurança na manipulação de memória sem necessidade de um coletor de lixo (garbage collector). Ele define regras rigorosas sobre como os dados são alocados, acessados e liberados, prevenindo problemas como data races e memory leaks.

Princípios de Ownership:

  1. Cada valor tem um único proprietário – Apenas uma variável pode possuir um dado.
  2. Quando o proprietário sai de escopo, o valor é automaticamente desalocado – Isso evita vazamentos de memória.
  3. O valor pode ser movido ou emprestado – O movimento transfere a posse, enquanto o empréstimo permite acesso temporário.

Exemplos de Ownership:

fn main() {
    let s1 = String::from("Hello"); // `s1` é o dono da string
    let s2 = s1; // `s1` perde a posse, e `s2` se torna o novo dono
    
    println!("{}", s1); // Erro! `s1` não tem mais acesso ao valor.
}

Aqui, s1 passa sua posse para s2, tornando s1 inválido.

Para evitar isso, podemos usar referências com borrowing:

fn main() {
    let s1 = String::from("Hello");
    let s2 = &s1; // `s2` pega uma referência emprestada
    
    println!("{}", s1); // Funciona! `s1` ainda é o dono.
}

O uso de &s1 permite acessar o valor sem transferir a posse.

Segundo a IA, Ownership é um conceito poderoso que evita erros comuns de memória sem necessidade de gerenciamento manual.

Hello?

Carregando publicação patrocinada...
4

Há um entendimento equivocado sobre esse assunto que se espalhou na comunidade Rust.

O mecanismo de propriedade não tem nada a ver com coletor de lixo. Ele não elimina o coletor de lixo, ele apenas garante que a referência não será perdida sem precisa de controles complexos (se bem que muita gente considera o sistema de borrow complexo).

Outro erro é as pessoas acharem que coletor de lixo é só se tiver um mecanismo de tracing, como é em praticamente todas as linguagens de script, Java, C#, etc. Mesmo um controle de referência é um coletor de lixo. A coleta de lixo é quando a memória no heap é coletada automaticamente, não importa o mecanismo.

E adivinha? O String de Rust faz a coleta automaticamente para você. Então você não precisa de um coletor de lixo porque já tem dentro deste objeto.

A única coisa que o mecanismo apresentado faz, é garantir que não tenha mais de um dono do objeto, assim ele sabe que no momento que aquele objeto sair de escopo é necessário chamar um destrutor de String, o compilador coloca para você e faz a coleta do que agora é lixo.

Sem esse mecanismo você pode ter mais de um objeto sendo dono e em situações mais complexas (não essa do exemplo acima) ele não saber disso e achar que porque um dono não terá mais a posse do objeto já pode remover o objeto do heap, mas ainda tem outro dono. Isso pode acontecer em C ou C++. Mas estão criando mecanismos para controlar isso.

Mas e se quiser ser mais eficiente e alocar na pilha? C e C++ isso é trivial e precisa tomar alguns cuidados. Por isso em aplicações reais Rust não consegue ser mais rápido que C ou C++, embora em testes sintéticos é fácil demonstrar que são iguais.

Rust não pode alocar String na pilha? Que eu saiba não, pode ter outros mecanismos que faça isso, pode ser que dê com o uso de contexto unsafe que perde o controle de propriedade. Eu não me aprofundei nisso, mas se alocado na pilha desalocar já é automático mesmo.

Também é necessário dizer que este exemplo provavelmente não funciona assim. Porque ele tem apenas uma referência para um texto estático, ou seja, ele estará no executável, portanto, ele será alocado na memória em uma região que não pode ser mexida, não é nem a pilha, nem o heap. Então eu acredito que String tem uma otimização para a referência interna para o texto seja apontado diretamente para essa área estática e que nunca é desalocada, aí não tem uma coleta de lixo, mas só porque teve uma otimização em tempo de compilação, algo que boa parte das linguagens já fazem também.

IAs não sabem o que dizem, elas apenas repetem o que foi muito repetido pela internet. Ela pode estar dizendo a verdade, mas não toda a verdade. E a fonte colocada não tem nada para constatar o que foi dito. Isso é o mesmo que escrever "Fonte: a internet". ou "Fonte: a biblioteca".

Para entender mais comece por aqui: https://pt.stackoverflow.com/q/498527/101 (siga os links).

Depois vá em: https://pt.stackoverflow.com/q/252163/101 e https://pt.stackoverflow.com/q/280973/101 e termine vendo os links de https://pt.stackoverflow.com/q/342463/101.

S2


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui no perfil também).