๐Ÿ“š Usando new e delete com Arrays · C++

๐Ÿ“š 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[]

// Alocaรงรฃo: tipo* nome = new tipo[tamanho]; int tamanho = 10; int* arr = new int[tamanho]; // Aloca array de 10 inteiros // Uso do array (sintaxe idรชntica a arrays estรกticos) arr[0] = 42; arr[1] = 100; // Liberaรงรฃo: delete[] nome; delete[] arr; // Libera TODO o array arr = nullptr; // Boa prรกtica
⚠️ Regra de Ouro: newdelete   |   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.

int n; cout << "Quantos nรบmeros deseja armazenar? "; cin >> n; // Cria um array exatamente do tamanho necessรกrio int* numeros = new int[n]; for (int i = 0; i < n; i++) { cout << "Nรบmero " << i + 1 << ": "; cin >> numeros[i]; } // Processa os dados... delete[] numeros;

๐Ÿ“ Inicializaรงรฃo de Arrays Dinรขmicos

Arrays alocados com new[] podem ser inicializados de vรกrias formas.

// 1. Sem inicializaรงรฃo (valores indeterminados) int* arr1 = new int[5]; // Valores "lixo" // 2. Inicializaรงรฃo com zero (parรชnteses vazios) int* arr2 = new int[5](); // Todos os elementos = 0 // 3. Inicializaรงรฃo com lista (C++11) int* arr3 = new int[5]{1, 2, 3, 4, 5}; // 4. Inicializaรงรฃo parcial (restante รฉ zerado) int* arr4 = new int[5]{1, 2}; // {1, 2, 0, 0, 0} // 5. Arrays de objetos (requer construtor padrรฃo) std::string* nomes = new std::string[3]{"Ana", "Bruno", "Carla"};

๐Ÿงฎ 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)

int linhas = 3, colunas = 4; // Aloca um รบnico bloco contรญguo de memรณria int* matriz = new int[linhas * colunas]; // Acesso: matriz[i * colunas + j] for (int i = 0; i < linhas; i++) { for (int j = 0; j < colunas; j++) { matriz[i * colunas + j] = i * colunas + j; } } delete[] matriz; // Apenas um delete[]

Mรฉtodo 2: Array de Ponteiros (Mais Intuitivo)

int linhas = 3, colunas = 4; // Aloca array de ponteiros int** matriz = new int*[linhas]; // Aloca cada linha for (int i = 0; i < linhas; i++) { matriz[i] = new int[colunas]; } // Acesso: matriz[i][j] (sintaxe natural) matriz[1][2] = 42; // Liberaรงรฃo: ordem inversa! for (int i = 0; i < linhas; i++) { delete[] matriz[i]; } delete[] matriz;
๐Ÿ’ก Qual mรฉtodo escolher?
  • 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>> ou std::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.

int* redimensionar(int* arrAntigo, int tamAntigo, int tamNovo) { int* arrNovo = new int[tamNovo]; // Copia elementos (atรฉ o menor tamanho) int copiar = (tamAntigo < tamNovo) ? tamAntigo : tamNovo; for (int i = 0; i < copiar; i++) { arrNovo[i] = arrAntigo[i]; } delete[] arrAntigo; return arrNovo; } // Uso: int* dados = new int[5]{1, 2, 3, 4, 5}; dados = redimensionar(dados, 5, 10); // Agora tem 10 elementos

Nota: Em C++, std::vector faz tudo isso automaticamente e de forma mais segura. Use new[]/delete[] apenas quando realmente necessรกrio.

⚠️ Armadilhas Comuns

ErroConsequรชnciaCorreรงรฃo
Usar delete em vez de delete[]Comportamento indefinido, vazamento parcialSempre usar delete[] para arrays
Esquecer de liberarMemory leak (vazamento de memรณria)Garantir delete[] para cada new[]
Acessar รญndice fora dos limitesBuffer overflow, corrupรงรฃo de memรณriaValidar รญndices; usar std::vector::at()
Liberar duas vezes (double delete)Crash ou corrupรงรฃo do heapAtribuir nullptr apรณs delete[]

๐Ÿ“Š Arrays Dinรขmicos vs. std::vector

Caracterรญsticanew[] / delete[]std::vector
RedimensionamentoManual (trabalhoso)Automรกtico (resize(), push_back())
Liberaรงรฃo de memรณriaManual (risco de vazamento)Automรกtica (RAII)
Verificaรงรฃo de limitesNenhuma (acesso direto)at() verifica e lanรงa exceรงรฃo
Tamanho conhecidoNรฃo (precisa armazenar separadamente)size() sempre disponรญvel
Controle de baixo nรญvelTotalLimitado

๐Ÿ’ก Boas Prรกticas

  • Prefira std::vector a 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[] com delete[] — considere usar smart pointers (std::unique_ptr<int[]>).
  • Atribua nullptr apรณs delete[] 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)

#include <memory> // unique_ptr especializado para arrays (delete[] automรกtico!) std::unique_ptr<int[]> arr = std::make_unique<int[]>(10); arr[0] = 42; arr[1] = 100; // NรƒO precisa de delete[]! Memรณria liberada automaticamente ao sair do escopo

๐Ÿ”— 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.

⏭️ Prรณximo: Aritmรฉtica de ponteiros...

Postar um comentรกrio

0 Comentรกrios