Neste tutorial, aprenderemos a gerenciar a memória de forma eficaz em C ++ usando operações new e delete com a ajuda de exemplos.
C ++ nos permite alocar a memória de uma variável ou array em tempo de execução. Isso é conhecido como alocação de memória dinâmica.
Em outras linguagens de programação, como Java e Python, o compilador gerencia automaticamente as memórias alocadas às variáveis. Mas este não é o caso em C ++.
Em C ++, precisamos desalocar manualmente a memória alocada dinamicamente após não termos uso para a variável.
Podemos alocar e desalocar memória dinamicamente usando os operadores new
e delete
respectivamente.
C ++ novo operador
O new
operador aloca memória para uma variável. Por exemplo,
// declare an int pointer int* pointVar; // dynamically allocate memory // using the new keyword pointVar = new int; // assign value to allocated memory *pointVar = 45;
Aqui, alocamos memória dinamicamente para uma int
variável usando o new
operador.
Observe que usamos o ponteiro pointVar para alocar a memória dinamicamente. Isso ocorre porque o new
operador retorna o endereço do local da memória.
No caso de uma matriz, o new
operador retorna o endereço do primeiro elemento da matriz.
No exemplo acima, podemos ver que a sintaxe para usar o new
operador é
pointerVariable = new dataType;
excluir operador
Uma vez que não precisamos mais usar uma variável que declaramos dinamicamente, podemos desalocar a memória ocupada pela variável.
Para isso, o delete
operador é usado. Ele retorna a memória para o sistema operacional. Isso é conhecido como desalocação de memória .
A sintaxe para este operador é
delete pointerVariable;
Considere o código:
// declare an int pointer int* pointVar; // dynamically allocate memory // for an int variable pointVar = new int; // assign value to the variable memory *pointVar = 45; // print the value stored in memory cout << *pointVar; // Output: 45 // deallocate the memory delete pointVar;
Aqui, alocamos memória dinamicamente para uma int
variável usando o ponteiro pointVar.
Depois de imprimir o conteúdo de pointVar, desalocamos a memória usando delete
.
Nota : Se o programa usa uma grande quantidade de memória indesejada usando new
, o sistema pode travar porque não haverá memória disponível para o sistema operacional. Neste caso, o delete
operador pode ajudar o sistema a travar.
Exemplo 1: Alocação de memória dinâmica C ++
#include using namespace std; int main() ( // declare an int pointer int* pointInt; // declare a float pointer float* pointFloat; // dynamically allocate memory pointInt = new int; pointFloat = new float; // assigning value to the memory *pointInt = 45; *pointFloat = 45.45f; cout << *pointInt << endl; cout << *pointFloat << endl; // deallocate the memory delete pointInt, pointFloat; return 0; )
Resultado
45 45,45
Neste programa, alocamos memória dinamicamente para duas variáveis de tipos int
e float
. Depois de atribuir valores a eles e imprimi-los, finalmente desalocamos as memórias usando o código
delete pointInt, pointFloat;
Nota: A alocação de memória dinâmica pode tornar o gerenciamento de memória mais eficiente.
Principalmente para arrays, onde muitas vezes não sabemos o tamanho do array até o tempo de execução.
Exemplo 2: C ++ new e delete Operator for Arrays
// C++ Program to store GPA of n number of students and display it // where n is the number of students entered by the user #include #include using namespace std; int main() ( int num; cout <> num; float* ptr; // memory allocation of num number of floats ptr = new float(num); cout << "Enter GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 <> *(ptr + i); ) cout << "Displaying GPA of students." << endl; for (int i = 0; i < num; ++i) ( cout << "Student" << i + 1 << " :" << *(ptr + i) << endl; ) // ptr memory is released delete () ptr; return 0; )
Resultado
Insira o número total de alunos: 4 Insira o GPA de alunos. Aluno1: 3,6 Aluno2: 3,1 Aluno3: 3,9 Aluno4: 2,9 Exibindo GPA dos alunos. Aluno1: 3,6 Aluno2: 3,1 Aluno3: 3,9 Aluno4: 2,9
Neste programa, pedimos ao usuário para inserir o número de alunos e armazená-lo na variável num.
Então, alocamos a memória dinamicamente para o float
array usando new.
Nós inserimos os dados no array (e depois os imprimimos) usando a notação de ponteiro.
Depois que não precisamos mais do array, desalocamos a memória do array usando o código delete () ptr;
.
Observe o uso de ()
after delete
. Usamos os colchetes ()
para denotar que a desalocação de memória é a de um array.
Exemplo 3: C ++ new e delete Operator for Objects
#include using namespace std; class Student ( int age; public: // constructor initializes age to 12 Student() : age(12) () void getAge() ( cout << "Age = " << age
Output
Age = 12
In this program, we have created a
Student
class that has a private variable age.
We have initialized age to
12
in the default constructor Student()
and print its value with the function getAge()
.
In
main()
, we have created a Student
object using the new
operator and use the pointer ptr to point to its address.
The moment the object is created, the
Student()
constructor initializes age to 12
.
We then call the
getAge()
function using the code:
ptr->getAge();
Notice the arrow operator
->
. This operator is used to access class members using pointers.