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
- Use a Stack por padrão.
- Use
unique_ptr se precisar de Heap.
- 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)!