A coleta de lixo basicamente significa que seus objetos alocados são liberados automaticamente em algum momento depois que não são mais acessíveis.
Mais precisamente, eles são liberados quando se tornam inacessíveis para o programa, pois objetos referenciados circularmente nunca seriam liberados.
Ponteiros inteligentes apenas se referem a qualquer estrutura que se comporte como um ponteiro comum, mas com alguma funcionalidade extra anexada. Eles incluem, entre outros, desalocação, mas também cópia em gravação, cheques encadernados, ...
Agora, como você afirmou, ponteiros inteligentes podem ser usados para implementar uma forma de coleta de lixo.
Mas a linha de pensamento segue da seguinte maneira:
- A coleta de lixo é uma coisa legal de se ter, pois é conveniente e eu tenho que cuidar de menos coisas
- Portanto: eu quero coleta de lixo no meu idioma
- Agora, como colocar o GC no meu idioma?
Claro, você pode projetá-lo assim desde o início. O C # foi projetado para ser coletado como lixo, portanto, apenas new
seu objeto será liberado quando as referências estiverem fora do escopo. Como isso é feito depende do compilador.
Mas em C ++, não havia coleta de lixo pretendida. Se alocarmos algum ponteiro int* p = new int;
e ele ficar fora do escopo, p
ele próprio será removido da pilha, mas ninguém cuidará da memória alocada.
Agora, a única coisa que você tem desde o início são destruidores determinísticos . Quando um objeto sai do escopo em que foi criado, seu destruidor é chamado. Em combinação com modelos e sobrecarga de operador, você pode projetar um objeto wrapper que se comporte como um ponteiro, mas usa a funcionalidade destruidora para limpar os recursos anexados a ele (RAII). Você chama este de ponteiro inteligente .
Tudo isso é altamente específico em C ++: Sobrecarga de operador, modelos, destruidores, ... Nesta situação específica de linguagem, você desenvolveu indicadores inteligentes para fornecer o GC desejado.
Mas se você projetar uma linguagem com o GC desde o início, isso é apenas um detalhe da implementação. Você acabou de dizer que o objeto será limpo e o compilador fará isso por você.
Ponteiros inteligentes, como em C ++, provavelmente não seriam possíveis em linguagens como C #, que não têm nenhuma destruição determinística (o C # contorna isso, fornecendo açúcar sintático para chamar .Dispose()
certos objetos). Os recursos não referenciados serão finalmente recuperados pelo GC, mas indefinidos quando exatamente isso acontecerá.
E isso, por sua vez, pode permitir que o GC faça seu trabalho com mais eficiência. Sendo incorporado mais profundamente à linguagem do que os ponteiros inteligentes, os quais são definidos por cima, o .NET GC pode, por exemplo, atrasar as operações de memória e executá-las em blocos para torná-las mais baratas ou até mover a memória para aumentar a eficiência com base na frequência com que os objetos são acessados.