๐ Usando new e delete com Arrays
"Os operadores new[] e delete[] permitem alocar e liberar arrays cujo tamanho รฉ determinado em tempo de execuรงรฃo, oferecendo flexibilidade que arrays estรกticos nรฃo possuem."
Enquanto arrays estรกticos tรชm tamanho fixo definido em tempo de compilaรงรฃo, arrays dinรขmicos alocados com new[] podem ter seu tamanho determinado durante a execuรงรฃo do programa. Isso รฉ essencial quando a quantidade de dados a armazenar sรณ รฉ conhecida apรณs o inรญcio da execuรงรฃo.
๐ Sintaxe Bรกsica de new[] e delete[]
new → delete | new[] → delete[]. Nunca misture! Usar delete em vez de delete[] para liberar um array causa comportamento indefinido e geralmente vazamento de memรณria.
๐ฏ Array com Tamanho Definido pelo Usuรกrio
A principal vantagem da alocaรงรฃo dinรขmica รฉ poder definir o tamanho do array em tempo de execuรงรฃo.
๐ Inicializaรงรฃo de Arrays Dinรขmicos
Arrays alocados com new[] podem ser inicializados de vรกrias formas.
๐งฎ Arrays Multidimensionais Dinรขmicos
Criar matrizes dinรขmicas requer um pouco mais de trabalho, pois new nรฃo suporta diretamente mรบltiplas dimensรตes.
Mรฉtodo 1: Alocaรงรฃo Contรญgua (Recomendado)
Mรฉtodo 2: Array de Ponteiros (Mais Intuitivo)
- Alocaรงรฃo contรญgua: Melhor desempenho (cache-friendly), menos fragmentaรงรฃo, um รบnico
delete[]. Recomendada para a maioria dos casos. - Array de ponteiros: Sintaxe
matriz[i][j]mais natural, permite linhas de tamanhos diferentes (matriz irregular). - Em C++ moderno, prefira
std::vector<std::vector<int>>oustd::vector<int>com รญndice calculado.
๐ Redimensionando Arrays Dinรขmicos
Arrays alocados com new[] nรฃo podem ser redimensionados diretamente. ร necessรกrio alocar um novo array, copiar os dados e liberar o antigo.
Nota: Em C++, std::vector faz tudo isso automaticamente e de forma mais segura. Use new[]/delete[] apenas quando realmente necessรกrio.
⚠️ Armadilhas Comuns
| Erro | Consequรชncia | Correรงรฃo |
|---|---|---|
Usar delete em vez de delete[] | Comportamento indefinido, vazamento parcial | Sempre usar delete[] para arrays |
| Esquecer de liberar | Memory leak (vazamento de memรณria) | Garantir delete[] para cada new[] |
| Acessar รญndice fora dos limites | Buffer overflow, corrupรงรฃo de memรณria | Validar รญndices; usar std::vector::at() |
| Liberar duas vezes (double delete) | Crash ou corrupรงรฃo do heap | Atribuir nullptr apรณs delete[] |
๐ Arrays Dinรขmicos vs. std::vector
| Caracterรญstica | new[] / delete[] | std::vector |
|---|---|---|
| Redimensionamento | Manual (trabalhoso) | Automรกtico (resize(), push_back()) |
| Liberaรงรฃo de memรณria | Manual (risco de vazamento) | Automรกtica (RAII) |
| Verificaรงรฃo de limites | Nenhuma (acesso direto) | at() verifica e lanรงa exceรงรฃo |
| Tamanho conhecido | Nรฃo (precisa armazenar separadamente) | size() sempre disponรญvel |
| Controle de baixo nรญvel | Total | Limitado |
๐ก Boas Prรกticas
- ✅ Prefira
std::vectora arrays dinรขmicos manuais na maioria dos casos. - ✅ Use
new[]/delete[]apenas quando precisar de controle absoluto sobre a memรณria ou em cรณdigo de sistemas embarcados. - ✅ Sempre emparelhe
new[]comdelete[]— considere usar smart pointers (std::unique_ptr<int[]>). - ✅ Atribua
nullptrapรณsdelete[]para evitar dangling pointers. - ✅ Para matrizes 2D, prefira alocaรงรฃo contรญgua (um รบnico
new[]) por eficiรชncia.
๐ก️ Usando unique_ptr para Arrays (C++11)
๐ Conclusรฃo
Os operadores new[] e delete[] fornecem a base para alocaรงรฃo dinรขmica de arrays em C++, permitindo criar estruturas de tamanho variรกvel em tempo de execuรงรฃo. Embora sejam ferramentas poderosas, exigem cuidado e disciplina para evitar vazamentos e comportamentos indefinidos. Em C++ moderno, o uso de std::vector e smart pointers รฉ fortemente recomendado, relegando new[]/delete[] a situaรงรตes especรญficas de baixo nรญvel.
0 Comentรกrios