DEV Community

Cover image for Dia 3 - Garbage collector e .h
Matheus Gomes
Matheus Gomes

Posted on

Dia 3 - Garbage collector e .h

Iniciei meu primeiro projeto em C++ e já aprendi algumas coisas interessantes.

Comecei criando o 'blank canvas' e o principal para o jogo funcionar: o game loop.

Sobre Garbage Collector

Enquanto estava implementando essas funcionalidades, eu percebi que instanciei um objeto do seguinte modo:

 Food food = Food();
Enter fullscreen mode Exit fullscreen mode

Olhei pra essa linha, e tive a sensação de faltar algo.
Normalmente em Java, ou até mesmo em TypeScript, quando instanciamos um objeto vem a palavra new antes dele. E descobri que no C++ também tem esse new mas por qual motivo ele não foi utilizado?

Bem, quando instanciamos o objeto desse modo, ele é alocado na pilha(stack), ou seja, quando o objeto sai do escopo (por exemplo, ao final da função), ele é "destruído" automaticamente e sua memória é liberada.

Utilizando o new o objeto é alocado no heap, e por conta disso temos que liberar a memória com a palavra reservada delete no final do escopo.

Com o Java não há problema alocar objetos no heap (inclusive, esse é o único modo) pois a memória é gerenciada automaticamente pelo Garbage Collector.

E o que é garbage collector?
Resumindo: É um sistema de gerenciamento automático de memória, ele detecta e libera memória ocupada por objetos e variáveis que não estão mais sendo utilizadas, evitando vazamento de memória(memory leak).

Então, podemos concluir que o C++ não tem garbage collector, pois quando alocamos um objeto no heap, temos que liberar a memória ao final do escopo para não haver memory leak.

Mas, se C++ não tem garbage collector, por qual razão não precisamos preocupar com vazamento de memória quando instanciamos um objeto na stack?
Isso acontece pelo seguinte motivo: Quando um objeto é alocado na stack a memória é automaticamente liberada por conta de um destrutor e de um gerenciamento feito no tempo de vida dos objetos que ocorre na stack chamado RAII (Resource Acquisition Is Initialization).

Tá, mas então o que diferencia o RAII do Garbage Collector?
Olha... isso é um buraco de coelho. Irei aceitar por enquanto que o que difere um do outro é a maneira de como os recursos são liberados.

Deixo com vocês as vantagens e desvantagens pontuadas pelo nosso amigo ChatGPT:

Vantagens e Desvantagens

**RAII**:

**Vantagens**:
- Controle preciso e previsível sobre quando os recursos são liberados.
- Não há sobrecarga de tempo de execução para monitorar e coletar objetos.
- Boa para gerenciar diferentes tipos de recursos, não apenas memória.

**Desvantagens**:
- Requer que o programador entenda bem como funcionam os construtores e destrutores.
- Não gerencia a memória no heap automaticamente. Se o programador usar `new`, é necessário usar `delete` manualmente.

**Garbage Collector**:

**Vantagens**:
- Facilita o gerenciamento de memória, pois o programador não precisa se preocupar em liberar memória manualmente.
- Reduz o risco de erros manuais, como vazamentos de memória ou uso de ponteiros para memória já liberada.

**Desvantagens**:
- O garbage collector pode introduzir sobrecargas de desempenho, especialmente em sistemas de tempo real, devido às pausas imprevisíveis.
- A coleta de memória é não determinística, o que significa que a memória pode permanecer alocada por mais tempo do que o necessário, aumentando o consumo de recursos.

Enter fullscreen mode Exit fullscreen mode

Sobre o .h

De forma bem breve, da pra dizer que o .h do C++ funciona de modo parecido com uma interface em Java.
Ambos separam o que o código faz de como o código faz.
O .h é uma assinatura de como a classe deve ser, assim como na interface que é utilizada no Java.

Proximos passos

Vou continuar codando esse snake game, e tem me passado na cabeça codar um Sistema Operacional, acho que programar muitos jogos vai ficar massante, então partirei para outros tipos de projetos.

Tchau.

Top comments (0)