🆕 Criando Variáveis em Tempo de Execução
"Os operadores new e delete permitem alocar e liberar memória dinamicamente no heap durante a execução do programa, oferecendo flexibilidade para criar estruturas de tamanho variável."
Enquanto variáveis locais e globais têm seu tamanho e tempo de vida definidos em tempo de compilação, a alocação dinâmica permite criar e destruir variáveis conforme a necessidade durante a execução. Isso é essencial para estruturas como listas, árvores, vetores de tamanho variável e qualquer situação onde a quantidade de dados só é conhecida em tempo de execução.
📌 O Operador new
O operador new aloca memória no heap para uma variável ou objeto e retorna um ponteiro para o endereço alocado.
🗑️ O Operador delete
O operador delete libera a memória previamente alocada com new, devolvendo-a ao heap. Esquecer de liberar memória causa vazamento (memory leak).
new, deve existir um delete correspondente. Caso contrário, a memória alocada nunca será liberada, causando vazamento de memória (memory leak).
📚 Arrays Dinâmicos com new[] e delete[]
Para alocar arrays cujo tamanho só é conhecido em tempo de execução, use new[] e libere com delete[].
delete em vez de delete[] para liberar um array causa comportamento indefinido e geralmente vazamento parcial de memória.
📌 Inicialização de Arrays Dinâmicos
🏗️ Alocação de Objetos (Classes/Structs)
new e delete também funcionam com tipos definidos pelo usuário, invocando construtores e destrutores apropriadamente.
⚠️ E se new Falhar?
Se não houver memória suficiente, new lança uma exceção std::bad_alloc. Alternativamente, pode-se usar new (nothrow) que retorna nullptr em caso de falha.
🛡️ Smart Pointers: Uma Alternativa Mais Segura
Em C++ moderno, recomenda-se o uso de smart pointers (std::unique_ptr, std::shared_ptr) que gerenciam a memória automaticamente, eliminando a necessidade de chamar delete manualmente.
📊 new/delete vs. malloc/free (C)
| Característica | new / delete (C++) | malloc / free (C) |
|---|---|---|
| Chama construtores/destrutores | ✅ Sim | ❌ Não |
| Retorna tipo correto | ✅ Sim (ponteiro tipado) | ❌ Retorna void* (precisa cast) |
| Tamanho da alocação | Calculado automaticamente | Deve ser especificado em bytes |
| Falha na alocação | Lança exceção (ou nullptr com nothrow) | Retorna NULL |
| Uso recomendado | C++ | C (evitar em C++) |
- ✅ Prefira smart pointers (
unique_ptr,shared_ptr) anew/deletemanuais. - ✅ Use
new/deleteapenas quando absolutamente necessário. - ✅ Sempre emparelhe
newcomdeleteenew[]comdelete[]. - ✅ Atribua
nullptrapósdeletepara evitar dangling pointers. - ✅ Considere containers da STL (
std::vector,std::string) em vez de arrays dinâmicos manuais.
🔗 Conclusão
Os operadores new e delete fornecem controle granular sobre a alocação de memória em C++. Embora sejam ferramentas poderosas, exigem disciplina e atenção para evitar vazamentos e comportamentos indefinidos. Em C++ moderno, o uso de smart pointers e containers da STL é fortemente recomendado, relegando new/delete a casos específicos de baixo nível ou implementação de estruturas de dados personalizadas.
0 Comentários