O que é Coleta de Lixo C ++?

A coleta de lixo é uma técnica de gerenciamento de memória. É um método de gerenciamento automático de memória separado, usado em linguagens de programação nas quais o gerenciamento manual de memória não é preferido ou feito. No método de gerenciamento manual de memória, o usuário deve mencionar a memória que está em uso e que pode ser desalocada, enquanto o coletor de lixo coleta a memória que é ocupada por variáveis ​​ou objetos que não são mais utilizados no programa. Somente a memória será gerenciada pelos coletores de lixo, outros recursos, como destruidores, janela de interação do usuário ou arquivos, não serão manipulados pelo coletor de lixo.

Poucos idiomas precisam de coletores de lixo como parte do idioma para uma boa eficiência. Esses idiomas são chamados de idiomas coletados pelo lixo. Por exemplo, Java, C # e a maioria das linguagens de script precisam de coleta de lixo como parte de seu funcionamento. Enquanto linguagens como C e C ++ oferecem suporte ao gerenciamento manual de memória, que funciona de maneira semelhante ao coletor de lixo. Existem poucos idiomas que suportam a coleta de lixo e a alocação / desalocação de memória gerenciada manualmente e, nesses casos, um monte de memória separado será alocado para o coletor de lixo e a memória manual.

Alguns dos erros podem ser evitados quando o método de coleta de lixo é usado. Tal como:

  • problema do ponteiro oscilante no qual a memória apontada já está desalocada, enquanto o ponteiro ainda permanece e aponta para diferentes dados reatribuídos ou memória já excluída
  • o problema que ocorre quando tentamos excluir ou desalocar uma memória pela segunda vez que já foi excluída ou realocada para outro objeto
  • remove problemas ou bugs associados às estruturas de dados e faz a memória e o tratamento de dados com eficiência
  • vazamentos de memória ou problemas de exaustão de memória podem ser evitados

Vamos ver um entendimento detalhado do gerenciamento manual de memória versus coleta de lixo, vantagens, desvantagens e como ele é implementado em C ++.

Gerenciamento manual de memória

A memória alocada dinamicamente durante o tempo de execução do heap precisa ser liberada assim que pararmos de usar essa memória. A memória alocada dinamicamente retira a memória do heap, que é um armazenamento livre de memória.

No C ++, essa alocação e desalocação de memória são feitas manualmente usando comandos como new, delete. O uso de memória 'nova' é alocado a partir da pilha. Após seu uso, essa memória deve ser limpa usando o comando 'delete'.

Toda alocação de memória com 'novo' deve ser finalizada com um comando 'excluir'. Caso contrário, ficaremos sem memória.

Para mostrá-lo claramente com um exemplo:

n = novo objeto de amostra;
******* uso é implementado aqui *******
delete n;

Como mostrado, todo novo deve terminar ou inclinar-se com um comando de exclusão. Aqui n ponteiro é alocado de memória usando o comando 'new' e é referenciado ou apontado para um objeto chamado 'sample_object'. Depois que o uso e o funcionamento do ponteiro forem concluídos, devemos liberar ou liberar a memória usando o comando 'delete', conforme feito acima.

Porém, no caso de coleta de lixo, a memória é alocada usando o comando 'new', mas não precisa ser liberada manualmente usando 'delete'. Nesses casos, o coletor de lixo é executado periodicamente, verificando se há memória livre. Quando um pedaço de memória não é apontado por nenhum objeto, ele limpa ou libera a memória, criando mais espaço livre na pilha.

Vantagens e desvantagens do gerenciamento manual de memória

As vantagens do gerenciamento manual de memória são que o usuário teria controle total sobre as operações de alocação e desalocação e também saberá quando uma nova memória é alocada e quando é desalocada ou liberada. Porém, no caso de coleta de lixo, exatamente na mesma instância após o uso, a memória não será liberada, ela será liberada quando a encontrar durante a operação periódica.

Também no caso do gerenciamento manual de memória, o destruidor será chamado no mesmo momento em que chamarmos o comando 'delete'. Mas no caso de coletor de lixo que não está implementado.

Existem alguns problemas associados ao uso do gerenciamento manual de memória. Às vezes, tendemos a excluir duas vezes a memória ocupada. Quando excluímos o ponteiro ou a memória já excluída, há chances de o ponteiro estar fazendo referência a outros dados e estar em uso.

Outro problema que temos no gerenciamento manual de memória é: se houver uma exceção durante a execução ou uso do novo ponteiro alocado de memória, ele sairá da sequência de 'novo' e 'excluir' e a operação de liberação não será realizada. Além disso, pode haver problemas de vazamento de memória.

Vantagens e desvantagens do coletor de lixo

Uma grande desvantagem da coleta de lixo é o tempo envolvido ou os ciclos de CPU envolvidos para encontrar a memória não utilizada e excluí-la, mesmo se o usuário souber qual memória do ponteiro pode ser liberada e não está em uso. Outra desvantagem é que não saberemos o horário em que ele será excluído nem quando o destruidor for chamado.

Algoritmo de Coleta de Lixo

Existem muitos algoritmos de coleta de lixo, como contagem de referência, marcação e varredura, cópia, etc. Vamos ver um algoritmo em detalhes para melhor entendimento. Por exemplo, quando vemos o algoritmo de contagem de referência, cada memória dinâmica terá uma contagem de referência. Quando uma referência é criada, a contagem de referências aumenta e sempre que uma referência é excluída, a contagem de referências é diminuída. Quando a contagem de referência se torna zero, mostra que a memória não está sendo usada e pode ser liberada.

Esse algoritmo pode ser implementado em C ++ usando um tipo de ponteiro específico. Um tipo de ponteiro específico deve ser declarado e pode ser usado para fins como acompanhar todas as referências criadas, acompanhar a contagem de referências quando a referência é criada e excluída. Um programa C ++ pode conter gerenciamento de memória manual e coleta de lixo acontecendo no mesmo programa. De acordo com a necessidade, pode ser usado o ponteiro normal ou o ponteiro específico do coletor de lixo.

Portanto, para resumir, a coleta de lixo é um método oposto ao gerenciamento manual de memória. Em um coletor de lixo, a memória é liberada automaticamente com base em uma periodicidade periódica ou em critérios específicos que informam se ela não está mais em uso. Ambos os métodos têm suas próprias vantagens e desvantagens. Isso pode ser implementado e usado de acordo com a complexidade da função, dependendo do idioma usado e seu escopo.

Artigos recomendados

Este é um guia para a coleta de lixo do C ++. Aqui discutimos o gerenciamento manual de memória e o algoritmo de coleta de lixo, além das vantagens e desvantagens. Você também pode consultar nossos outros artigos sugeridos para saber mais -

  1. Construtor e Destrutor em Java
  2. Funções de seqüência de caracteres C ++
  3. Destruidor em Java
  4. Aplicações de C ++ no mundo real
  5. Os 11 principais recursos e vantagens do C ++