Pular para conteúdo

Aula 14 - Memória Moderna 🧠


O Pesadelo do C++ Antigo

  • new sem delete.
  • Ponteiros soltos apontando para lixo.
  • Memory Leaks que travam servidores.

O Mundo Moderno (Modern C++)

  • O objetivo é zerar o uso de new e delete manuais.

Smart Pointers (Ponteiros Inteligentes)

  • Objetos que se comportam como ponteiros, mas limpam a memória sozinhos!
  • Baseados em RAII.

std::unique_ptr

  • Posse Exclusiva.
  • Apenas um dono para o recurso.
  • Não pode ser copiado, apenas movido (std::move).

Criando um unique_ptr

auto p = make_unique<Pizza>("Calabresa");
- Destruído automaticamente ao fim do escopo.


std::shared_ptr

  • Posse Compartilhada.
  • Vários ponteiros apontam para o mesmo objeto.
  • Usa Contador de Referências.

Como funciona o Shared?

  • Cada novo ponteiro incrementa o contador.
  • Cada destruição decrementa.
  • Quando chega a Zero, o objeto é deletado.

Criando um shared_ptr

auto p1 = make_shared<int>(42);
auto p2 = p1; // Ambos apontam para o mesmo lugar

std::weak_ptr

  • O "Observador".
  • Aponta para um objeto gerenciado por shared_ptr, mas não impede que ele seja deletado.

Quando usar Weak?

  • Para quebrar Ciclos de Referência (A aponta pra B, B aponta pra A).
  • Sem o weak, eles nunca seriam deletados!

Make Functions vs New

  • Use make_unique e make_shared.
  • Mais seguros contra exceções e mais rápidos.

Custom Deletters

  • Smart pointers podem ser usados para gerenciar outros recursos (como fechar sockets ou arquivos) automaticamente.

Move Semantics (Semântica de Movimentação)

  • Em vez de copiar dados caros, "roubamos" os dados de um objeto temporário.
  • Transformamos Cópia em Transferência.

Lvalues vs Rvalues

  • Lvalue: Variável com nome e endereço fixo.
  • Rvalue: Valor temporário (ex: resultado de uma conta).

std::move

  • Transforma um Lvalue em um Rvalue, permitindo a movimentação.

Rule of Five

  • Se sua classe gerencia memória, você precisa de:
  • Destrutor
  • Copy Constructor
  • Copy Assignment
  • Move Constructor
  • Move Assignment

Rule of Zero

  • Tente usar containers e smart pointers para que você não precise escrever nenhuma das 5 funções acima!

Prevenção de Memory Leaks

  • Ferramentas como Valgrind ou Sanitizers ajudam a encontrar erros.

O Futuro: Garbage Collection no C++?

  • C++ prefira o determinismo do RAII sobre o custo do GC.

Melhores Práticas de Memória

  1. Use a Stack por padrão.
  2. Use unique_ptr se precisar de Heap.
  3. Use shared_ptr apenas se a posse for realmente dividida.

Resumo da Aula

  • Esqueça o new e o delete.
  • RAII é a lei.
  • Smart pointers tornam o C++ tão seguro quanto linguagens modernas.

Fim da Aula 14

  • Próxima aula: Multiplataforma e Build (CMake)!