Dominando Gerenciamento de Memória em C++: Uso Expert de new e delete
Dominando Gerenciamento de Memória em C++: Uso Expert de new e delete
Este guia explica como alocar e liberar memória na heap em C++ com new e delete, ilustrado com exemplos claros e reais.
C++ dá aos desenvolvedores o poder de alocar memória em tempo de execução — conhecido como alocação dinâmica de memória. Diferente de linguagens gerenciadas como Java ou Python, C++ não recupera automaticamente a memória da heap; o programador deve liberá-la explicitamente.
Usar os operadores new e delete fornece o mecanismo básico para essa tarefa. Esses operadores são a base do gerenciamento manual de memória em C++ e estão definidos na biblioteca padrão C++.
O Operador new
O operador new aloca um bloco de memória na heap e retorna um ponteiro para seu primeiro byte. Por exemplo:
// declarar um ponteiro int int* pointVar; // alocar memória dinamicamente usando new pointVar = new int; // atribuir valor à memória alocada *pointVar = 45;
Neste snippet, pointVar recebe o endereço de um int recém-alocado. Como new retorna um ponteiro, a variável deve ser do tipo ponteiro. Para arrays, new retorna um ponteiro para o primeiro elemento:
int* arr = new int[10]; // arr aponta para o primeiro elemento de um array de 10 ints
A sintaxe geral é:
pointerVariable = new dataType; // objeto único pointerVariable = new dataType[size]; // array
O Operador delete
Quando um objeto ou array alocado com new não é mais necessário, delete deve ser chamado para liberar a memória de volta ao sistema operacional. Falhar em fazer isso resulta em vazamentos de memória que podem degradar o desempenho ou travar a aplicação.
Para um único objeto:
delete pointerVariable;
Para um array alocado com new[], use a forma de array:
delete[] pointerVariable;
Exemplo de um ciclo de vida completo:
// alocar um int int* pointVar = new int; *pointVar = 45; cout << *pointVar; // Saída: 45 // desalocar delete pointVar;
Dica: Pareie cada new com um delete correspondente (ou delete[] para arrays). Use RAII ou ponteiros inteligentes (ex: std::unique_ptr) para automatizar esse processo em código de produção.
Exemplo 1: Alocação Dinâmica Básica
#include <iostream> using namespace std; int main() { int* pointInt; float* pointFloat; pointInt = new int; pointFloat = new float; *pointInt = 45; *pointFloat = 45.45f; cout << *pointInt << endl; cout << *pointFloat << endl; delete pointInt; delete pointFloat; return 0; }
Saída
45 45.45
Este programa demonstra alocação de dois tipos primitivos, atribuição, saída e desalocação limpa.
Nota: A alocação dinâmica pode melhorar a flexibilidade, especialmente quando o tamanho é determinado em tempo de execução.
Exemplo 2: Alocando um Array de Floats
#include <iostream> using namespace std; int main() { int num; cout << "Digite o total de alunos: "; cin >> num; float* ptr = new float[num]; cout << "Digite a média dos alunos." << endl; for (int i = 0; i < num; ++i) { cout << "Aluno" << i + 1 << ": "; cin >> *(ptr + i); } cout << "\nExibindo médias dos alunos." << endl; for (int i = 0; i < num; ++i) { cout << "Aluno" << i + 1 << " :" << *(ptr + i) << endl; } delete[] ptr; return 0; }
Saída
Digite o total de alunos: 4 Digite a média dos alunos. Aluno1: 3.6 Aluno2: 3.1 Aluno3: 3.9 Aluno4: 2.9 Exibindo médias dos alunos. Aluno1 :3.6 Aluno2 :3.1 Aluno3 :3.9 Aluno4 :2.9
O programa solicita ao usuário o número de alunos, aloca um array float conforme necessário, coleta a entrada, exibe os dados e finalmente libera a memória com delete[].
Exemplo 3: Alocação Dinâmica de um Objeto
#include <iostream> using namespace std; class Student { int age; public: Student() : age(12) {} void getAge() { cout << "Idade = " << age << endl; } }; int main() { Student* ptr = new Student(); ptr->getAge(); delete ptr; return 0; }
Saída
Idade = 12
Este exemplo cria um objeto Student na heap. O construtor inicializa age com 12, e o método getAge o imprime. Após o uso, delete libera a memória do objeto.
Linguagem C
- Fundamentos de Memória Digital: Endereçamento, Acesso e Volatilidade
- Dominando Variáveis, Literais e Constantes em C++: Guia Completo
- Classes e Objetos em C++: Guia Prático de Programação Orientada a Objetos
- Dominando Herança em C++: Public, Protected & Private Explicados
- Funções Amigas e Classes Amigas em C++: Dominando o Controle de Acesso
- Dominando Operações com Diretórios e Arquivos em Python
- Estruturas vs Classes em C++: Guia Prático para Desenvolvedores Embarcados
- Raspberry Pi 3 B+ – Recursos Atualizados, Especificações e Guia de Compra
- GE Digital Lança Software de Gestão Preditiva de Ativos, Mudando Manutenção de Reativa para Proativa
- Wittmann Battenfeld Revela Nova Série X e Robôs Primus 14